** 认识函数式编程**
- 函数式编程是一种编程范式,跟面向对象编程是并列关系
- 函数式编程可以很大程度让代码可以复用
- 函数式编程中的函数是数学中的函数或方法
**函数概念**
- 函数是一等公民
- 函数可以存储在变量中
- 函数可以作为参数
- 函数可以作为返回值
**高阶函数**
- 一个或多个函数作为参数输入
- 输出一个函数作为返回值
- map,filter,reduce...
**闭包**
- 内部函数可以访问其所在的外部函数中生命的参数和变量,即使在其外部函数被返回(寿命终结)了之后。
- 函数是js中唯一拥有自身作用域的结构,闭包的创建依赖于函数
**函数柯里化**
柯里化(Currying):
- 当一个函数有多个参数的时候先传第一部分参数调用它(这部分参数以后永远不变)
- 然后返回一个新的函数接收剩余的参数,返回结果
lodash中的柯里化函数
-
_.curry(func)
-
功能:创建一个函数,该函数接收一个或多个func的参数,如果func所需要的参数都被提供则执行func并返回执行的结果,否则继续返回该函数并等待接收剩余的参数
-
参数:需要柯里化的函数
-
返回值:柯里化后的函数
**总结**
- 柯里化可以让我们给一个函数传递较少的参数得到一个已经记住了某些固定参数的新函数
- 这是一种对函数参数的'缓存'
- 让函数变得更灵活,让函数的粒度更小
- 可以把多元函数转换成一元函数,可以组合使用函数产生强大的功能
**lodash的fp模块**
- loadsh的fp模块提供了实用的对函数式编程友好的方法
- 提供了不可变 auto-curried iteratee-first data-last的方法
**核心特性**
- 自动curry化
- 迭代优先数据置后
- immutable
**Point Free**
_不使用所要处理的值,只合成运算过程。“无值”风格_
Point Free:我们可以把数据处理的过程定义成与数据无关的合成运算,不需要用到代表数据的那个参数,只要把简单的运算步骤合成到一起,在使用这种模式之前我们需要定义一些辅助的基本运算函数。
- 不需要指明处理的数据
- 只需要合成运算过程
- 需要定义一些辅助的基本运算函数
**Functor(函子)**
_是实现了map函数并遵守一些特定规则的容器类型_
_值被容器化之后具有一条标准协议规范的数据类型或者数据容器_
- 容器:包涵值和值的变形关系(这个变形关系就是函数)
- 函子:是一个特殊的容器,通过一个普通的对象来实现,该对象具有map方法,map方法可以运行一个函数对值进行处理(变形关系)
_**MayBe函子处理外部的空值情况,防止空值的异常**_
_**either函子处理异常,记录出错的信息**_
**IO函子**
- IO函子中的_value是一个函数,这里是把函数作为值来处理
- IO函子可以把不纯的动作存储到_value中,延迟执行这个不纯的操作(惰性执行),包装当前的纯操作
- 把不纯的操作交给调用者来处理
**folktale**
`folktale是个标准的函数式编程库,它和lodash,ramda不同的他里面没有提供功能性的函数,比如lodash和ramda 的中都提供了很多数组和字符串操作相关的方法。只提供了一些跟函数式处理相关的操作,例如composed/curry柯里化`
_**point**_ of函数
**_Task函子处理异步任务_**
**_Monad函子是可以变扁的Pointed函子,IO(IO(x))_**
- 一个函子如果具有join和of两个方法并遵守一些定律就是一个Monad