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

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上阅读更多内容.


Eug*_*Sh. 6

赋予两个参数的函数只有一个导致该函数的部分应用,其结果是一个(剩余的)参数的函数.在您的情况下,返回函数的签名是Integer -> Integer.


lef*_*out 6

注意

\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].