函数的合成
如果一个值要经过多个函数,才能变成另一个值,可以把中间步骤合并成一个函数,这叫做函数的合成
上图中,X 和 Y 之间的变形关系是函数 f,Y 和 Z 之间的变形关系是函数 g,那么 X 和 Z 之间的关系,就是 g 和 f 的合成函数 g·f。
- const compose = function(f, g) {
- return function(x) {
- return f(g(x))
- }
- }
函数的合成还必须满足结合率
- compose(f, compose(g, h)); // 等同于 compose(compose(f, g), h); // 等同于 compose(f, g, h)
合成也是函数必须是纯的一个原因。因为一个不纯的函数,怎么跟其他函数合成?怎么保证各种合成以后,它会达到预期的行为?
前面说过,函数就像数据的管道(pipe)。那么,函数合成就是将这些管道连了起来,让数据一口气从多个管道中穿过。
柯里化
f(x) 和 g(x) 合成为 f(g(x)),有一个隐藏的前提,就是 f 和 g 都只能接收一个参数,如果可以接收多个参数,比如 f(x, y) 和 g(a, b, c),函数合成就会非常麻烦
这时就需要函数柯里化了。所谓 "柯里化",就是把一个多参数的函数,转化为单参数函数。
- function add(x, y) {
- return x + y;
- }
- add(1, 2) // 3 function Add(x){ // 对第一个参数没有进行处理,只是返回的函数中通过闭包拿到参数值 return function(y){ return x + y; } } Add(1)(2)
有了柯里化以后,我们就能做到,所有函数只接受一个参数。后文的内容除非另有说明,都默认函数只有一个参数,就是所要处理的那个值。
函子
函数不仅可以用于同一个范畴之中值的转换,还可以用于将一个范畴转成另一个范畴。这就涉及到了函子(Functor)
函子是函数式编程里面最重要的数据类型,也是基本的运算单位和功能单位。
它首先是一种范畴,也就是说,是一个容器,包含了值和变形关系。比较特殊的是,它的变形关系可以依次作用于每一个值,将当前容器变形成另一个容器。
就爱阅读 www.92to.com 网友整理上传, 为您提供最全的知识大全, 期待您的分享,转载请注明出处。
来源: http://www.92to.com/bangong/2017/03-12/18561848.html