闲聊函数式编程的一点知识。

100 阅读2分钟

u=4290233154,679069917&fm=253&fmt=auto&app=138&f=JPEG.webp

纯函数

  1. 什么是纯函数:相同的输入得到相同的输出,不依赖不影响外部环境也不产生副作用,输出完全取决于输入;
  2. 什么是副作用:只要跟函数外部环境发生了交互就是副作用。
  3. 纯函数有什么优势:可移植性,可测试,易维护。 4, 高阶函数左倾,高阶函数执行顺序是由右往左执行。

例子

       let split = (str) => {
            return str.split("")
        };
        let reverse= (str) => {
            return str.reverse()
        };
        let  join=(str)=>{
            return str.join(",")
        };
        let  toUpperCase=(str)=>{
            return str.toUpperCase()
        };

所有这些函数是单独抽取出来的,又相互调用的。所以需要用一个纯函数进行调用。

封装一个公用函数

    function compose(){
            var args=Array.from(arguments);
            return function(x){
                 return args.reduce((prev,cur)=>{
                    return cur(prev)
                 },x)
            }
        }
    const init=compose(split,reverse,join,toUpperCase);
    console.log(init('肉蛋冲击'));
    打印出来就是"击冲肉蛋"

函数结合律

函数组合中参数再进行组合函数结果不受影响。

    const init1=compose(split,reverse,compose(join,toUpperCase));
    console.log(init1('肉蛋冲击'));
    打印出来就是"击冲肉蛋"

pointfree 风格的意思大致是只在乎参数不在乎数据怎么处理。类似这种组合函数就是这种风格。

自己写一个简单的缓存函数

 //写一个缓存函数
     function text(fn){
        let ache={};
      return function(x){
         if(!ache[x]){
            ache[x]='1'
            return true;
         }else{
          return fn(x);
         }
      }
     }
    let  someFn=(a)=>{
        console.log(a+'Tokio Tomare');
    }
     const initFn=text(someFn);
     initFn('砸哇鲁多')
     initFn('砸哇鲁多')
     第一个不会做出打印
     第二个打印为 '砸哇鲁多Tokio Tomare'

拓展简单实现filter函数例子

  function filters(fn){
    if(!fn){
        return
    }
    let arr=[];
   return function(data){
        data.forEach(element => {
            console.log(fn(element))
            if(fn(element)){
               arr.push(element);  
            }
     });
     return arr;
    }
  }
  // 实现filter 函数
   let filterFn=filters(function(x){return x===2});
   console.log(filterFn([1,2,3,4,2]));
   打印出来[2,2]
   这个列子属于是多此一举。用这种函数实现。