Есть ли в Haskell оператор сплат, такой как Python и Ruby? - PullRequest
15 голосов
/ 14 августа 2011

В Python и Ruby (и других, я уверен).Вы можете добавить префикс enumerable к * ("splat"), чтобы использовать его в качестве списка аргументов.Например, в Python:

>>> def foo(a,b): return a + b
>>> foo(1,2)
3
>>> tup = (1,2)
>>> foo(*tup)
3

Есть ли что-то похожее в Haskell?Я предполагаю, что это не будет работать в списках из-за их произвольной длины, но я чувствую, что с кортежами это должно работать.Вот пример того, что я хотел бы:

ghci> let f a b = a + b
ghci> :t f
f :: Num a => a -> a -> a
ghci> f 1 2
3
ghci> let tuple = (1,2)

Я ищу оператор (или функцию), который позволяет мне делать:

ghci> f `op` tuple
3

Я видел (<*>) будучи названным "splat", но это не похоже на то же самое, что и splat в других языках.Я все равно попробовал:

ghci> import Control.Applicative
ghci> f <*> tuple

<interactive>:1:7:
    Couldn't match expected type `b0 -> b0'
                with actual type `(Integer, Integer)'
    In the second argument of `(<*>)', namely `tuple'
    In the expression: f <*> tuple
    In an equation for `it': it = f <*> tuple

Ответы [ 3 ]

15 голосов
/ 14 августа 2011

Да, вы можете применять функции к кортежам, используя пакет tuple . В частности, обратите внимание на функцию uncurryN , которая обрабатывает до 32 наборов:

Prelude Data.Tuple.Curry> (+) `uncurryN` (1, 2)
3
3 голосов
/ 14 августа 2011

Нет, системе типов Хаскелла это не нравится.Проверьте этот похожий вопрос для более подробной информации:

Как определить применение Lisp в Haskell?

Кстати, оператор сплата, о котором вы говорите, также известен как apply функция, обычно встречающаяся на динамических функциональных языках (таких как LISP и Javascript).

3 голосов
/ 14 августа 2011

Функция uncurry превращает функцию с двумя аргументами в функцию в кортеже. Списки не будут работать вообще из-за их требования к однородности.

...