• 函数式编程-函数的合成与柯里化


    函数式编程有两个最基本的运算:合成和柯里化。

    2.1 函数的合成

    如果一个值要经过多个函数,才能变成另外一个值,就可以把所有中间步骤合并成一个函数,这叫做"函数的合成"(compose)。

    上图中,XY之间的变形关系是函数fYZ之间的变形关系是函数g,那么XZ之间的关系,就是gf的合成函数g·f

    下面就是代码实现了,我使用的是 JavaScript 语言。注意,本文所有示例代码都是简化过的,完整的 Demo 请看《参考链接》部分。

    合成两个函数的简单代码如下。

    
    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)。那么,函数合成就是将这些管道连了起来,让数据一口气从多个管道中穿过。

    2.2 柯里化

    f(x)g(x)合成为f(g(x)),有一个隐藏的前提,就是fg都只能接受一个参数。如果可以接受多个参数,比如f(x, y)g(a, b, c),函数合成就非常麻烦。 

    这时就需要函数柯里化了。所谓"柯里化",就是把一个多参数的函数,转化为单参数函数。

    
    // 柯里化之前
    function add(x, y) {
      return x + y;
    }
    
    add(1, 2) // 3
    
    // 柯里化之后
    function addX(y) {
      return function (x) {
        return x + y;
      };
    }
    
    addX(2)(1) // 3
    

    有了柯里化以后,我们就能做到,所有函数只接受一个参数。后文的内容除非另有说明,都默认函数只有一个参数,就是所要处理的那个值。

    http://www.ruanyifeng.com/blog/2017/02/fp-tutorial.html

  • 相关阅读:
    【读书笔记】iOS-简单的数据驱动程序
    数据结构—单链表(类C语言描写叙述)
    使用Hadoop ACL 控制訪问权限
    Iocomp控件之数字显示【图文】
    维护的JSP站点数据丢失
    Simditor用法
    Android实战简易教程-第二十六枪(基于ViewPager实现微信页面切换效果)
    Deferred Rendering(三)反锯齿和半透明问题
    iOS Code Sign error: Provisioning profile can't be found 解决方式
    spring
  • 原文地址:https://www.cnblogs.com/feng9exe/p/8371023.html
Copyright © 2020-2023  润新知