一、函子
为什么要学习函子?
到目前为止已经学习了函数式编程的一些基础,但是我们还没有演示在函数式编程中如何把副作用控制在可控范围之内、
异常处理、异步操作等。
什么是Functor?
容器:包含值和值的变形关系,这个变形关系就是函数。
函子:是一个特殊的容器,通过一个普通的对象来实现,该对象具有map方法,map方法可以运行一个函数对值进行处理。
总结:
1、函数式编程的运算不直接操作值,而是有函子完成。
2、函子就是一个实现了map契约的对象。
3、我们可以把函子想象成一个盒子,这个盒子里封装了一个值。
4、想要处理盒子中的值,我们需要给盒子的map方法传递一个处理值的函数(纯函数),由这个函数对值进行处理。
5、最终map方法返回一个包含新值的函子。
二、MAYBE函子
我们在编程过程中可能会遇到很多错误,需要对这些错误做相应处理。
Maybe函子的作用就是可以对外部的空值情况做出处理(控制副作用在允许的范围内)
三、EITHER函子
Either两者中的任何一个,类似于if...else...的处理
异常会让函数变得不纯,Either函数可以用来处理异常
四、IO函子
IO函子中的_value是一个函数,这里把函数作为值处理。
IO函子可以把不纯的操作储存到_value,延迟执行这个不纯的操作,惰性执行,包装当前的操作。
把不纯的操作交给调用者处理。
五、TASK异步执行
异步任务的实现过于复杂,一般使用folktale中的Task
folktale是一个标准的函数式编程库
和lodash、ramda不同的是,他没有提供很多功能函数
只提供了一些函数式处理的操作:compose、curry等,一些函子Task、Either、Maybe等。
六、Monad函子
Monad是可以变扁的Pointed函子(具有of方法的函子),可解决IO函子的嵌套问题。
一个函数如果具有join和of两个方法并遵守一定的定律就是一个Monad函子。
网友评论