Haskell:带有两个参数的匿名函数

时间:2015-07-08 18:53:23

标签: haskell anonymous-function

我有以下匿名功能:

(\x y -> y+y) (5*(7+20))

据我所知,匿名函数x应该是(5 *(7 + 20))并且没有给出y(这是它变得可疑的地方)。当我尝试执行该函数时,GHCI告诉我返回值是

Integer -> Integer

显然,我的解释在这里是错误的,我只是不明白为什么。谁能向我解释这里发生了什么?

3 个答案:

答案 0 :(得分:11)

这样看:如果你为y提供了一个值,你就得到一个整数。如果你没有提供一个值,你将得到一个带整数的表达式(你称之为y)并返回一个整数,即一个函数

Integer -> Integer

这也适用于命名函数。例如。

plus :: Int -> Int -> Int
plus x y = x + y

您可以在ghci中检查plus 1的类型是否为Int -> Int。实际上,此过程适用于Haskell中的任何函数。您可以在HaskellWiki了解更多信息。

答案 1 :(得分:6)

给一个两个参数的函数只有一个导致该函数的partial application,其结果是一个(剩余的)参数的函数。在您的情况下,返回函数的签名是Integer -> Integer

答案 2 :(得分:6)

请注意

\x y -> y+y

的语法糖
\x -> (\y -> y+y)

即。而不是说“两个参数的lambda函数”,你可能会说它只是一个参数的函数。返回类型恰好是一个函数。

这种currying技术对于良好的Haskell代码至关重要;部分应用程序使许多事情非常简洁而不牺牲可读性。例如,

GHCi> map (logBase 2) [1,2,4,8,16]
[0.0, 1.0, 2.0, 3.0, 4.0]

这里我使用logBase作为单个参数(2)的函数,这给了我一个简单的数字→数字函数,可以映射到列表。没有currying,我需要写map (\x -> logBase(2,x)) [1,2,4,8,16]