我有以下匿名功能:
(\x y -> y+y) (5*(7+20))
据我所知,匿名函数x应该是(5 *(7 + 20))并且没有给出y(这是它变得可疑的地方)。当我尝试执行该函数时,GHCI告诉我返回值是
Integer -> Integer
显然,我的解释在这里是错误的,我只是不明白为什么。谁能向我解释这里发生了什么?
答案 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]
。