Haskell返回函数的getAddFunc示例类型签名与定义逻辑疑问
Haskell 柯里化语法规则解释
Haskell 所有函数本质上都仅接收1个参数,你看到的多参数函数定义是**柯里化(Currying)**设计提供的语法糖,和你理解的函数签名逻辑完全一致,具体说明如下:
- 你疑惑的
getAddFunc x y = x + y写法,和下方的写法完全等价:
getAddFunc :: Int -> (Int -> Int) getAddFunc x = \y -> x + y
Haskell 会自动把多参数的函数定义拆解为「接收第一个参数,返回捕获了该参数的新函数」的形式,和你理解的Int -> (Int -> Int)签名完全匹配。
- 函数签名里的
->是右结合运算符,因此Int -> Int -> Int和Int -> (Int -> Int)是完全等价的写法,前者是常规多参数函数的简写,后者更突出返回函数的特性。
变量x、y的具体含义
x是调用getAddFunc时传入的第一个Int类型参数,会被返回的新函数作为闭包变量捕获留存,直到后续计算时使用y是getAddFunc返回的Int -> Int类型函数的入参,只有调用这个返回的函数时才需要传入
示例代码执行流程拆解
你给出的示例可以拆分为两个独立的函数调用步骤:
- 执行
adds3 = getAddFunc 3时,x被绑定为3,返回的adds3就是捕获了x=3的函数\y -> 3 + y,类型为Int -> Int - 执行
fourPlus3 = adds3 4时,给上述返回函数传入y=4,最终执行3 + 4得到结果7
你也可以直接写getAddFunc 3 4拿到相同结果,这只是上述两步调用的语法简写。
内容的提问来源于stack exchange,提问作者SLN
相关产品推荐
相关产品推荐

