haskell函数调用顺序

Joe*_*oey 1 haskell functional-programming

我从周末开始学习一些haskell,我发现这种语言很有趣,但是一些语法让我感到困惑.

喜欢,zip是一个函数,它将2个列表作为参数,然后返回一对列表.如果我调用zip [1,2,3] [3,2,1]ghci我得到了[(1,3),(2,2),(3,1)].但如果我说它(zip [1,2,3]) [3,2,1]返回相同的结果.

当我查看zip函数的定义时:i 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]返回相同的结果.

所以我的问题是函数是否接收多个参数,该函数如何评估,按顺序处理每个参数或只是一次处理所有参数.

rub*_*bik 5

(->) 是正确的关联¹,这意味着这样的事情:

zip :: [a] -> [b] -> [(a, b)]
Run Code Online (Sandbox Code Playgroud)

被GHC理解为:

zip :: [a] -> ([b] -> [(a, b)])
Run Code Online (Sandbox Code Playgroud)

后者可以帮助您查看当您zip使用一个参数调用时,您将获得一个函数:

?> :t zip [1, 2, 3]
zip [1, 2, 3] :: Num a => [b] -> [(a, b)]
Run Code Online (Sandbox Code Playgroud)

这称为currying或部分应用.


笔记

  1. 右关联意味着操作员组合在右侧.一个常见的例子是电力运营商^.在电力塔中,这是显而易见的: ?> 2^2^2^2 65536 ?> 2^(2^(2^2)) 65536

    如果幂算子是左关联的,我们会: ?> ((2^2)^2)^2 256