У haskell есть оператор splat, такой как python/ruby?

В 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

Ответ 1

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

Prelude Data.Tuple.Curry> (+) `uncurryN` (1, 2)
3

Ответ 2

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

Ответ 3

Нет, системе типа Haskell это не нравится. Проверьте этот аналогичный вопрос для получения более подробной информации:

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

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