Haskell有像Python和Ruby这样的splat运算符吗?

时间:2011-08-14 01:13:26

标签: haskell tuples splat

在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

3 个答案:

答案 0 :(得分:15)

是的,您可以使用tuple包将函数应用于元组。特别是检查uncurryN函数,该函数最多可处理32个元组:

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

答案 1 :(得分:3)

uncurry函数将两个参数上的函数转换为元组上的函数。由于需要同质性,列表一般不起作用。

答案 2 :(得分:3)

不,Haskell的类型系统不喜欢这样。请查看此类似问题以获取更多详细信息:

How do I define Lisp’s apply in Haskell?

顺便说一下,你谈到的splat运算符也称为apply函数,常见于动态函数式语言(如LISP和Javascript)。