Haskell中(`addTwo` 4) 5表达式的工作原理及通用规则问询
解析Haskell中
addTwo的第三种调用方式 函数与调用示例
函数定义
addTwo:: Num a => a -> a -> a addTwo a b = a + b
三种调用表达式
addTwo 4 5 -- 结果为9 4 `addTwo` 5 -- 结果为9 (`addTwo` 4) 5 -- 结果为9
第三种表达式的工作机制
你猜的没错,(addTwo 4)确实会变成一个单参数函数,背后的核心是Haskell的两个特性:柯里化和中缀函数的部分应用。
具体拆解:
- Haskell里所有多参数函数本质都是“返回函数的函数”,
addTwo的类型Num a => a -> a -> a其实是Num a => a -> (a -> a)的简写——意思是它接收一个a类型的值,返回一个新函数,这个新函数再接收一个a类型的值,最终返回a类型的结果。 - 用反引号把
addTwo变成中缀函数后,它就和+这类内置运算符用法一致了。当我们只给中缀函数的一侧传参时,就会得到一个“等待另一侧参数”的部分应用函数:(addTwo4)相当于把addTwo的第二个参数固定成了4,返回的新函数只需要再接收一个参数x,就会执行addTwo x 4(也就是xaddTwo4)。- 后面的
5就是传给这个新函数的参数,最终执行的是addTwo 5 4,结果自然是9。
举个更熟悉的例子,内置加法+的部分应用:(+ 4)是一个单参数函数,接收x返回x+4;而(+ 4)和它完全等价,只是写法上把+用反引号括了起来——addTwo作为中缀函数时,逻辑和+一模一样。
内容的提问来源于stack exchange,提问作者Mohit Kumar Jangid
相关产品推荐
相关产品推荐

