我从本周末开始学习一些haskell,我发现这种语言很有趣,但是一些语法让我感到困惑。
就像,zip
是一个函数,它将2个列表作为参数,然后返回一对列表。
如果我在zip [1,2,3] [3,2,1]
中调用ghci
,我会[(1,3),(2,2),(3,1)]
。但如果我说(zip [1,2,3]) [3,2,1]
它会返回相同的结果。
当我使用:i zip
查看zip函数的定义时,我得到了zip :: [a] -> [b] -> [(a, b)] -- Defined in ‘GHC.List’
,从这看来zip
是一个函数应用第一个参数,返回一个函数,然后应用于第二个参数。
另一个示例是elem
,elem 1 [1,2,3]
,(elem 1) [1,2,3]
和(1 `elem`) [1,2,3]
返回相同的结果。
所以我的问题是函数是否接收多个参数,此函数如何评估,按顺序处理每个参数或只是一次处理所有参数。
答案 0 :(得分:5)
(->)
是正确的关联¹,这意味着像这样:
zip :: [a] -> [b] -> [(a, b)]
GHC将理解为:
zip :: [a] -> ([b] -> [(a, b)])
后者可以帮助您看到当您使用一个参数调用zip
时,您将获得一个函数:
λ> :t zip [1, 2, 3]
zip [1, 2, 3] :: Num a => [b] -> [(a, b)]
这称为currying
,或部分申请。
注释
右关联意味着操作员组合在右侧。一个常见的例子是幂算子^
。在电力塔中,这是显而易见的:
λ> 2^2^2^2
65536
λ> 2^(2^(2^2))
65536
如果权力运算符是左关联的,我们会:
λ> ((2^2)^2)^2
256