zoukankan      html  css  js  c++  java
  • JavaScript柯里化(currying)

    参考:

    https://www.jianshu.com/p/33392cb4b055

    https://ruby-china.org/topics/38385

    https://stackoverflow.com/questions/36314/what-is-currying

    柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,
    并且返回接受余下的参数且返回结果的新函数的技术。
    这个技术由 Christopher Strachey 以逻辑学家 Haskell Curry 命名的。

    简单的javascript例子:

    function add(x, y){
        if(y===undefined){
            return (z) => x + z;
        }else{
            return x+y;
        }
    }
    
    测试
    add(1)(2)和add(1, 2)都返回3.

    我理解currying,即乐高模块化,如果要写一个复杂函数,可以分解成单一功能的模块,然后组装在一起。这样每个模块就可以在其他函数进行反复调用了。

    例子:

    对已知数组的已知量进行加N的操作,传统的写法:

    let ar= [1,2,3];
    function addToArray(ar,n){
      return ar.map((x)=> x+n)
    };
    console.log(addToArray(ar,1)

    但可以这么写:

    const add = a => b => a+b;
    const addToArray = (ar,n) => ar.map(add(n));
    addToArray([2,3],1)

    Currying的好处:

    上面连个例子结果相同,但过程不一样:

    第一是新写了一个函数,对数组进行map操作,

    第二则是在直接在map里进行add操作,这很通用,一旦你写了很多类似于add的函数,就会方便起来,可以让我们方便的在map,reduce,filter里调用。

    • 能够进行延迟计算,就像add(1)(2)一样,1比2先传入,2就会被延迟计算,在特定的场景里,有一定的应用意义。
    • 当你发现你要调用一个函数,并且调用参数都是一样的情况下,这个参数就可以被柯里化,以便更好的完成任务。
    • 优雅的写法,允许你写出来的代码更干净、更有表达力。

    虽然柯里化在日常应用不多,但仍然是一个不可不了解的好概念。

  • 相关阅读:
    预习非数值数据的编码方式
    预习原码补码
    C语言||作业01
    C语言寒假大作战04
    C语言寒假大作战03
    C语言寒假大作战02
    C语言寒假大作战01
    C语言|作业12—学期总结
    C语言|博客作业11
    第三章预习
  • 原文地址:https://www.cnblogs.com/chentianwei/p/11438211.html
Copyright © 2011-2022 走看看