本文首发于我的GitHub博客,其它博客同步更新。


函数式编程

什么是函数式编程

  • 程序的实质:依据输出通过某种运算取得相应的输入
  • “函数”:数学中的函数即映射关系:y = sin(x),y和x的关系
  • 纯函数:雷同的输出始终要失去雷同的输入
  • 作用:函数式编程就是用来形容数据之间的映射

函数的个性

函数是一等公民

  • 1.函数能够存储在变量中
  • 2.函数作为参数(高阶函数)
  • 3.函数作为返回值(高阶函数)

高阶函数

  • 能够把函数作为参数传递给另一个函数

    • 长处:灵便、不须要思考函数外部如何实现
  • 能够把函数作为另一个函数的返回值

闭包

  • 定义:函数和四周的状态(词法环境)的援用捆绑在一起造成闭包
  • 能够在另一个作用域中调用一个函数的外部函数并拜访到该函数的作用域中的成员

函数式的根底

纯函数

  • 定义:雷同的输出永远会失去雷同的输入,且没有副作用
  • 相似映射关系y = f(x)
  • 性能库:lodash

    • 纯函数必须有输出和输入
    • 函数式编程不会保留计算两头的后果,所以变量不可变(无状态的)
    • 能够把一个函数的执行后果交给另一个函数解决

副作用

  • 内部因素对程序后果的影响
  • 起源:配置文件、数据库、获取用户的输出……

柯里化

  • 定义:调用一个函数只传递局部的参数,并且返回新的函数,新函数去承受残余的参数,并且返回相应的后果

    • 当一个函数有多个参数的时候,先传递一部分参数调用它(这部分参数当前永远不变)
    • 而后返回一个新的函数接管残余的参数,返回后果
  • Lodash里的柯里化

    • _.curry(func)
    • 性能:该函数接管一个或者多个func的参数,如果func所须要的参数都被提供则执行func并返回执行的后果,否则持续返回该函数并期待接管残余的参数
    • 参数:须要柯里化的函数
    • 返回值:柯里化后的函数

管道

函数组合

  • 定义:如果一个函数要通过多个函数解决能力失去最终值,这个时候能够把两头过程的函数合并成一个函数
  • 艰深:函数就像是数据的管道,函数组合就是把这些管道连接起来,让数据穿过多个管道造成最终后果
  • 函数组合默认是从右到左执行
  • loadsh中的组合函数

    • _.flow()从左到右运行
    • _.flowRight()从右到左运行
  • 满足结合律:即,能够把g和f联合,还能够把f和g联合

函子

概念:是一个非凡的容器,通过一个一般的对象来实现,该对象具备map办法,map办法能够运行一个函数对值进行解决(变形关系)

  • 通过函管制副作用,也能够进行异样解决、异步操作等
  • 函数式编程的运算不间接操作值,而是由函子实现
  • 函子就是一个实现了map契约的对象
  • 函子就是一个盒子,盒子封装了一个值
  • 解决盒子的值,须要给map办法传递一个解决值得函数(纯函数)
  • 最终map办法会返回一个蕴含新值的盒子(函子)

Functor

MayBe

  • 函子解决空值问题

    • map外部进行三元判断

Either

  • Either函子能够用来做异样解决

    • 应用try{...}catch{...}别离调用两个函子对象,一个返回传入函数,一个返回失常输入后果

IO

  • _value作为一个函数解决,把不纯的操作交给调用者来解决

Task

  • folktale规范函数式编程库

    • 解决异步工作

Monad

  • 解决函子嵌套问题IO(IO(x))

    • 利用join、flatMap返回_value
面向对象:把事物形象成程序中的类和对象,通过封装、继承和多态演示事物分割(形象事物)