本文首发于个人GitHub博客,其它博客同步更新。git

函数式编程
什么是函数式编程
- 程序的本质:根据输入经过某种运算得到相应的输出
- “函数”:数学中的函数即映射关系:y = sin(x),y和x的关系
- 纯函数:相同的输入始终要获得相同的输出
- 做用:函数式编程就是用来描述数据之间的映射
函数的特性
函数是一等公民
- 1.函数能够存储在变量中
- 2.函数做为参数(高阶函数)
- 3.函数做为返回值(高阶函数)
高阶函数
能够把函数做为参数传递给另外一个函数github
- 能够把函数做为另外一个函数的返回值
闭包
- 定义:函数和周围的状态(词法环境)的引用捆绑在一块儿造成闭包
- 能够在另外一个做用域中调用一个函数的内部函数并访问到该函数的做用域中的成员
函数式的基础
纯函数
- 定义:相同的输入永远会获得相同的输出,且没有反作用
- 相似映射关系y = f(x)
功能库:lodash数据库
- 纯函数必须有输入和输出
- 函数式编程不会保留计算中间的结果,因此变量不可变(无状态的)
- 能够把一个函数的执行结果交给另外一个函数处理
反作用
- 外部因素对程序结果的影响
- 来源:配置文件、数据库、获取用户的输入……
柯里化
管道
函数组合
- 定义:若是一个函数要通过多个函数处理才能获得最终值,这个时候能够把中间过程的函数合并成一个函数
- 通俗:函数就像是数据的管道,函数组合就是把这些管道链接起来,让数据穿过多个管道造成最终结果
- 函数组合默认是从右到左执行
loadsh中的组合函数闭包
- _.flow()从左到右运行
- _.flowRight()从右到左运行
- 知足结合律:即,能够把g和f结合,还能够把f和g结合
函子
概念:是一个特殊的容器,经过一个普通的对象来实现,该对象具备map方法,map方法能够运行一个函数对值进行处理(变形关系)
- 经过函控制反作用,也能够进行异常处理、异步操做等
- 函数式编程的运算不直接操做值,而是由函子完成
- 函子就是一个实现了map契约的对象
- 函子就是一个盒子,盒子封装了一个值
- 处理盒子的值,须要给map方法传递一个处理值得函数(纯函数)
- 最终map方法会返回一个包含新值的盒子(函子)
Functor
MayBe
Either
Either函子能够用来作异常处理函数式编程
- 使用try{...}catch{...}分别调用两个函子对象,一个返回传入函数,一个返回正常输出结果
IO
- _value做为一个函数处理,把不纯的操做交给调用者来处理
Task
Monad
面向对象:把事物抽象成程序中的类和对象,经过封装、继承和多态演示事物联系(抽象事物)