• 函数式编程 pipe之函数柯里化


    1.pipe 管道:

    我们想让一个参数通过第一个函数之后再通过第二个函数 

    一般写法:

    const addOne = x => x + 1
    const addTwo = x => x + 2
    addTwo(addOne(1)) // 4

    pipe写法:

    const pipe = ...args => x => 
      args.reduce(
        (outputValue, currentFunction) => currentFunction(outputValue), x )
    备注:reduce语法
    array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
    total 必需。初始值, 或者计算结束后的返回值。
    currentValue 必需。当前元素
    currentIndex 可选。当前元素的索引
    arr 可选。当前元素所属的数组对象。
    实际案例展开:

    const pipe = (...fns) => x => fns.reduce((y, f) => f(y), x);
    展开:
    const pipe = function(x, ...fns) { fns.reduce((y, f) => f(y), x); }
    再展开:
    function pipe(x, ...fns){ let accu= x; for(let f in fns){ accu= f(accu) } return accu; }
     
    二,柯里化: 是一种将使用多个参数的一个函数转换成一系列使用一个参数的函数的技术
    function add(a,b,c){
                 return a+b+c;
             }
             add(1,2,3);//直接调用输出
    目的是变成单个参数调用输出:add(1)(2)(3);//参数分开调用输出
    function add(a){
                 return function(b){
                     return function(c){
                         return a + b + c;
                     }
                 }
             }
    改进版:
     var curry = function(func){
                 var args = [].slice.call(arguments,1); // 首先我们对通用函数截取参数
                 return function(){
                     var newArgs = args.concat([].slice.call(arguments)); //将每次添加的函数连接起来
                     return func.apply(this,newArgs); //将此函数的数组赋给目标函数 并传入参数
                 }
             }
             function sub(a,b){
                 return a-b;
             }
             var subcurry = curry(sub,5);
             
             console.log(subcurry(3));
    进化版:
    function add(a,b){
                 return a + b;
             }
             var currys = function(fn,args = []){
                 var length = fn.length; //计算期望函数的参数长度
                args =args; //利用闭包特性保存参数
                 return function(){
                     newArgs = [].slice.call(arguments); //将自身函数参数赋给新参数
                     
                     [].push.apply(newArgs,args); //将上回保留的参数push进新的数组
                     
                     if(newArgs.length<length){ //判断当前函数的参数是否与期望函数参数一致
                         return curry.call(this,fn,newArgs); //如果不够,递归调用
                     }else{
                         
                         return fn.apply(this,newArgs); // 如果够,就执行期望函数
                     }
                 }
             }
             var addcurry = currys(add);
             console.log(addcurry(1)(2));
     
  • 相关阅读:
    基于maven构建javaweb项目思路梳理及改进 在路上
    分圆多项式整理
    第03次作业栈和队列
    C语言第二次实验报告
    week01绪论作业
    第02次作业线性表
    C语言第一次实验报告
    工作流的问题
    无法使用Outlook 2003 Out Of Office Assisant
    刷机
  • 原文地址:https://www.cnblogs.com/937522zy/p/13679709.html
Copyright © 2020-2023  润新知