函数(Functor)函数,如何将反应控制在可控范围内,异常解决,异步操作等。在函数式编程中。 什么是函子容器:包含值及其屈折的函子(这个屈折就是函数)。函子是一个特殊的容器,由一个普通的对象实现。map方法可以运行一个函数来求解值(拐点)。概念总是很模糊,但还是要看几遍。我们自己实现一个函子吧。 //Function Function class container {构造函数(值){this。_ value = value//函数中必须有值,并且_的开头约定为内部私有变量。我不想对外使用} map(fn){ return new container(fn(this。_ value))//传入的函数解完这个值后,需要返回另一个函子}//try let r = new container(5)//返回的函子可以继续调用。map(x = >;x + 1)。map(x = & gt;x * x)console . log(r)//= & gt;{_value: 36}关注地图。以上是最简单的函子。我们要求解的是value value,而不是functor,但是我们把函数传入map,他会求解。 但是每次使用前要求有新的容器不方便(更多是因为函数式编程,不希望看到new,哈哈哈哈之类的运算符),所以类Container { static of(value){//new无法避免,所以封装了一个of方法。secretly new return new container(value)} constructor(value){ this。_ value = value } map(fn){ return container . of(fn(this。_ value))// Of是静态方法,可以直接调用}}//trylet r = container.of (3)。map(x = >;x + 2)。map(x = & gt;x * x)console . log(r)//= & gt;{_value: 25}所以函子是一个有map方法的对象。函子里要维护一个值(也就是你传入的),这个值永远不会发布,就像这个值被包装在一个盒子里一样。如果您想要操作该值,只需将函数传递到map中。 摘要函数式编程的操作不直接对值进行操作,而是由functor来完成,functor是实现map契约的对象。我们可以把functor想象成一个盒子,里面封装了一个值。为了求解盒子中的值,我们需要向盒子的map方法传递一个函数(纯函数)。该函数用于求解该值。最后,map方法返回一个包含新值的盒子(仿函数)。基本就是这样。当然,事情没有这么简单。使用函子的目的是为了解决反应。//如果是空值(反应)容器。of(空)。map(x = >;X.toupper case ()//typeerror:无法读取null may函数的属性“toupper case”我们在编程的过程中可能会遇到很多错误,有必要相应地解决这些错误。马也函数的作用是解决外部零点情况(控制反应在允许范围内)。类马也{ static of(value){ return new may(value)}构造函数(value) {this。_ value = value}是nothing(){//这里增加了一个新的函数来判断是否可以为空,返回这个。_ value = = null ||这个。_ value = = undefined } map(fn){//在执行fn之前做一个判断,空的时候会返回一个null函数,返回this.isNothing Maybe。of (null):也许吧。的(fn(这个。_ value))}}相比之前,我们尽量让r = maybe。of(空)。map(x = >;x . toupper case())console . log(r)//= & gt;{_value: null}也没有错误。//他还是不完美。请参见maybe.of('你好,北京')。map(x = >;x.toUpperCase())。map(x = & gt;Null) //假设这里出了问题,导致Null被传下去。map(x = >;x . split(' ')//= & gt;{_value: null}虽然陷进去了,但是Meybe很难追查到问题。没关系。我们有两个函数中的任何一个,类似于if...其他...解决异常会使函数不纯,两个函数都可以用于异常解决。//这里需要两个函数leftrightclassleft { static cof(value){ return new left(value)} constructor(value){ this。_ value = value } map(fn){ return This//这个比较特殊,是直接返回这个对象,为什么这里会这样?} }//这个右边和前面的容器没什么区别。class right { static of(value){ return new right(value)}构造函数(value) {this。_ value = value } map(fn){ return right . of(fn(this。_ value))} }//try//使用JSON.parse的异常使错误函数parse JSON(str){ try { return right . of(JSON . parse(str))} catch(e){ return left . of({ error:e . message })//转到错误,将错误消息返回到左边,因此,left的map直接返回this就够了} } let r = parse JSON(' { name:zs } ')//name不加双引号, 所以会给出一个错误console . log(r)/= > { _ value:{ error:“JSON中位置2出现意外的token n”} }没有代码错误,异常信息通过仿函数= = = = = = =分隔符= = = =后跟IO仿函数,Monad仿函数等显示。 这个东西我真的不懂,能力有限。我知道你看到这里的函子会很疑惑。我也是。其实原因是不知道哪里适用。不用担心,我们平时用的机会很少,包括面向对象编程。我们用过吗?我只在打包几个基础库的时候用过,所以无所谓。慢慢来(安慰自己)+++除了最后几个函子,函数式编程都完成了!附录函数式编程是指函数式编程的介绍。