柯里化的概念很简单,但是在介绍它之前,我们先回顾一下之前我们所认识的函数。比如 max,我们习惯于这样调用它:
Prelude> max 5 6 6
我们认为,max函数接受两个参数 5 和 6 并返回它们之中最大的结果,很顺理成章的想法。可是lamda函数只能是单一输入并且单一输出, 因此实际上,Haskell会这么解释它
(max 5) 6
怎么解释呢?首先,max函数接收单一输入5,并返回一个函数。这个函数同样会接收一个输入并返回它和5之中最大的数字。嗯,在命令行中这样做也是等价的
Prelude> let a = (max 5) Prelude> a 6 6
这就是柯里化。
因此,在Haskell的世界里,不存在多输入的函数,所有的函数都只有一个输入和一个输出,只是输出有何能是值也有可能是函数(实际上,数字在lamda演算中同样 被看作为函数)。
所以当你查看max的类型时,是这样显示的:
Prelude> :t max max :: Ord a => a -> a -> a
柯里化为函数的处理提供了极大的灵活性,我们可以由一个函数方便地生成另外一个函数,区别于图灵机的状态存取,函数式编程则注重于描述函数之间的关系。因此,基于这种思想 ,要解决一个问题,我们关注的是“做什么”而不是“怎么做”。