Ответ 1
Да, вы можете применять функции к кортежам, используя пакет tuple. Проверьте, в частности, функцию uncurryN:
Prelude Data.Tuple.Curry> (+) `uncurryN` (1, 2)
3
В python/ruby (и другие, я уверен). вы можете префикс перечислимого с помощью * ( "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
Да, вы можете применять функции к кортежам, используя пакет tuple. Проверьте, в частности, функцию uncurryN:
Prelude Data.Tuple.Curry> (+) `uncurryN` (1, 2)
3
Функция uncurry превращает функцию на два аргумента в функцию на кортеже. Списки не будут работать вообще из-за их требования к однородности.
Нет, системе типа Haskell это не нравится. Проверьте этот аналогичный вопрос для получения более подробной информации:
Как определить Lisp s в Haskell?
BTW, оператор splat, о котором вы говорите, также известен как функция apply
, обычно встречающаяся на динамических функциональных языках (например, LISP и Javascript).