hax*_*axl 3 haskell anonymous-function
我有以下匿名功能:
(\x y -> y+y) (5*(7+20))
Run Code Online (Sandbox Code Playgroud)
据我所知的匿名函数,x应该是(5*(7 + 20))并且没有给出y(这是它变得可疑的地方).当我尝试执行该功能时,GHCI告诉我返回值是
Integer -> Integer
Run Code Online (Sandbox Code Playgroud)
显然我的解释在这里是错误的,我只是不明白为什么.任何人都可以向我解释这里发生了什么?
Ada*_*ltz 11
这样看:如果你为y提供了一个值,你就得到一个整数.如果你没有提供一个值,你将得到一个带整数的表达式(你称之为y)并返回一个整数,即一个函数
Integer -> Integer
Run Code Online (Sandbox Code Playgroud)
这也适用于命名函数.例如
plus :: Int -> Int -> Int
plus x y = x + y
Run Code Online (Sandbox Code Playgroud)
您可以检查该ghci中的类型plus 1是Int -> Int.实际上,此过程适用于Haskell中的任何函数.您可以在HaskellWiki上阅读更多内容.
注意
\x y -> y+y
Run Code Online (Sandbox Code Playgroud)
是语法糖
\x -> (\y -> y+y)
Run Code Online (Sandbox Code Playgroud)
即,而不是说"两个参数的lambda函数",你可能会说它只是一个参数的函数.返回类型恰好是一个函数.
这种currying技术对于良好的Haskell代码至关重要; 部分应用程序使许多事情非常简洁而不牺牲可读性.例如,
GHCi> map (logBase 2) [1,2,4,8,16]
[0.0, 1.0, 2.0, 3.0, 4.0]
Run Code Online (Sandbox Code Playgroud)
在这里,我使用logBase了单个参数(2)的函数,它给了我一个简单的数字→数字函数,可以映射到列表.没有currying,我需要写map (\x -> logBase(2,x)) [1,2,4,8,16].