美文网首页大前端学习日记
函数式编程学习笔记

函数式编程学习笔记

作者: 桃之_夭夭_ | 来源:发表于2020-10-30 22:45 被阅读0次

    函数式编程

    函数式编程的核心思想是把运算过程抽象成函数,编程过程中面向函数进行编程

    一、纯函数:相同的输入永远会得到相同的输出,而且没有任何可观察的副作用

    // 纯函数
    function add(a, b){
      return a+b
    }
    
    // 非纯函数
    const array = [1,2,3]
    array.reverse()
    

    优点:

    1.可缓存,如lodash中的memoize

    2.可测试

    3.并行处理:多线程环境下并行操作共享的内存数据很可能会出现意外情况。纯函数不需要访问共享的内存数据,所以在并行环境下可以任意运行纯函数(Web Worker)

    二、柯里化

    当一个函数有多个参数的时候先传递一部分参数调用它(这部分参数以后都不变)然后返回一个新的函数接收剩余参数,返回结果。相当于把一元函数变成多元函数

    f(x,y,z)=>f(x)(y)(z)||f(x,y)(z)||f(x)(y,z)

    三、函数组合:把细粒度的函数重新组合生成一个新的函数;如果一个函数经过多个函数处理才得到最终值,这时候可以把中间过程的函数合并成一个函数

    // 组合函数
    const fp = require('lodash/fp')
    const f = fp.flowRight(fp.join('-'), fp.map(fp.toLower), fp.split(' '))
    console.log(f('NEVER SAY DIE'))
    

    四、函子:是一个特殊的容器,通过一个普通的对象来实现,该对象具有map方法,map方法可以运行一个函数对值进行处理(变形关系)

    const fs = require('fs')
    const fp = require('lodash/fp')
    // Monad函子
    class IO {
      static of(value) {
        return new IO(function () {
          return value
        })
      }
    
      constructor(fn) {
        this._value = fn
      }
    
      map(fn) {
        return new IO(fp.flowRight(fn, this._value))
      }
    
      join() {
        return this._value()
      }
    
      flatMap(fn) {
        return this.map(fn).join()
      }
    }
    
    let readFile = function (filename) {
      return new IO(function () {
        return fs.readFileSync(filename, 'utf-8')
      })
    }
    let print = function (x) {
      return new IO(function () {
        console.log(x)
        return x
      })
    }
    
    let cat = fp.flowRight(print, readFile)
    let r5 = cat('package.json')._value()._value()
    console.log(r5)
    
    let r6 = readFile('package.json')
      // .map((x) => x.toUpperCase())
      .map(fp.toUpper)
      .flatMap(print)
      .join()
    console.log(r6)
    
    

    文章内容输出来源:拉勾教育大前端高薪训练营;

    相关文章

      网友评论

        本文标题:函数式编程学习笔记

        本文链接:https://www.haomeiwen.com/subject/ehglvktx.html