Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell是否有类似Python和Ruby的splat操作符?_Haskell_Tuples_Splat - Fatal编程技术网

Haskell是否有类似Python和Ruby的splat操作符?

Haskell是否有类似Python和Ruby的splat操作符?,haskell,tuples,splat,Haskell,Tuples,Splat,在Python和Ruby中(我肯定还有其他的)。您可以使用*(“splat”)作为枚举的前缀,将其用作参数列表。例如,在Python中: >>> def foo(a,b): return a + b >>> foo(1,2) 3 >>> tup = (1,2) >>> foo(*tup) 3 哈斯克尔也有类似的地方吗?由于列表的任意长度,我假设它对列表不起作用,但我觉得对于元组它应该起作用。下面是我想要的一个例子: ghc

在Python和Ruby中(我肯定还有其他的)。您可以使用
*
(“splat”)作为枚举的前缀,将其用作参数列表。例如,在Python中:

>>> def foo(a,b): return a + b
>>> foo(1,2)
3
>>> tup = (1,2)
>>> foo(*tup)
3
哈斯克尔也有类似的地方吗?由于列表的任意长度,我假设它对列表不起作用,但我觉得对于元组它应该起作用。下面是我想要的一个例子:

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
ghci>导入控制。应用程序
ghci>f元组
:1:7:
无法匹配预期的类型'b0->b0'
实际类型为“%Integer,Integer”
在“()”的第二个参数中,即“tuple”
在表达式中:f tuple
在‘it’的等式中:it=f元组

uncurry函数将两个参数上的函数转换为元组上的函数。列表通常不起作用,因为它们需要同质性。

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


顺便说一句,您提到的splat操作符也称为
apply
函数,通常在动态函数语言(如LISP和Javascript)中找到。

是的,您可以使用包将函数应用于元组。请特别查看处理多达32个元组的函数:

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

需要澄清的是:你是说它不能在任意长度的元组上实现,但uncurry适用于成对的特殊情况吗?@gfxmonk:是的。元组中的每个数字组合和类型组合在Haskell的类型系统中都是不同的类型,因此函数不能接受每个元组类型。我猜这使用的是模板Haskell?谢谢,这很管用。不幸的是,它看起来只能任意定义多达15个元素的元组,但这可能已经足够了;)是的,它必须为单个元组类型定义,因为在Haskell中,每个元组类型在技术上是不同的类型。(因此
(a,b)
,或“pair”,是与
(a,b,c)
,或“triple”完全无关的类型——它们只是有一种特殊的语法,允许构造任意大的类型。)我不认为上面的包使用的是模板Haskell,尽管我不认识类定义中使用的“|”符号。@mgiuca:the“|”-此上下文中的符号表示一个。@Chuck:元组包中没有模板Haskell(尽管有一些自定义Haskell代码以字符串形式发出其他Haskell代码)。我认为这对于列表是正确的,但我在问题中特别询问了元组。@gfxmonk:不过,Python中的枚举值与列表类似,依我看,因为它们可以任意长度,splat的工作原理相同。在Haskell中,除非使用深层魔法,否则不能让函数处理任意元组。