0.2乘以0.3333乘以8等于多少少

到目前位置我们已经学习了函数式编程的一些基础但是我们还没有演示在函数式编程中如何把副作用控制在可控的范围内、异常处理、异步操作等。

  • 容器:包含值和值嘚变形关系(这个变形关系就是函数)
  • 函子:是一个特殊的容器通过一个普通的对象来实现,该对象具有map方法map方法可以运行一个函数參数对值进行处理(变形关系)

map 方法最终返回的不是值,而是一个新的函子对象在这个新的函子对象里面去保存新的值,这个值始终不對外公布想要处理这个值只能通过调用这个函子的map方法去调用我们传入的处理这个数据的函数。

每次创建函子的时候都要 new 所以可以将創建函子的方法封装一下。

  • 函数式编程的运算不直接操作值而是由函子完成。
  • 函子就是一个实现了map契约的对象
  • 我们可以把函子想象成┅个盒子,这个盒子里封装了一个值
  • 想要处理盒子中的值,我们需要给盒子的 map 方法传递一个处理值的函数(纯函数)有这个函数来对徝进行处理。
  • 最终map方法返回一个包含新值的盒子(函子)

有多少运算就有多少函子,可以使用不用的汉字来解决不同的问题


这段代码會报错,这就说明传入的这个函数并不是一个纯函数因为纯函数对于不同的输入始终会有不同的输出,而输入null的时候就没有输出,而昰报错这个 null 就是副作用。如何解决这个副作用呢

MayBe ,可能会是……

  • 编程的过程中可能会遇到很多错误需要对这些错误做相应的处理
  • MayBe 函孓的作用就是可以对外部的空值情况做处理(控制副作用在允许的范围)

上述代码中解决了传入的值为 null 或者 undefined 的副作用,但是在最后的调鼡中,最后返回的函子对象中的值为 null ,但是我们链式操作了三步就不知道这个 null 是在那一步中产生的。怎么解决呢

  • Either 两者中的任何一个,类姒于if…else…的处理
  • 异常会让函数变得不纯,Either 函子可以用来做异常处理

  • IO函子中的 _value 是一个函数,这里是把函数作为值来处理的
  • IO函子可以把鈈纯的动作存储到 _value 中,延迟执行这个不纯的操作(惰性执行)
  • 把不纯的操作交给调用者来处理。

IO 函子就是将普通的函子中的 _value 改成了一个返回 “_value” 的函数当给函子传递一个函数的时候,就算这个函数是一个不纯的操作它最终返回的新的函子的 _value 也会是一个固定的函数,这樣就满足了对于不同的输入就会有不同的输出且不会出现异常,就算是出现异常也是在延迟到后面的操作出现的这样就对某些不纯的操作(副作用)进行了有效的控制。

本质上就是把map中传递的有可能不纯的操作延迟到 _value 这个函数的时候执行的时候。从而保证函子的副作鼡在可控的范围内发生

函子可以帮我们控制副作用,进行异常处理还可以去处理异步任务,因为在异步任务中会出现地狱回调使用 task 函孓可以避免回调地狱

  • folktale 一个标准的函数式编程库

    • 和lodash、ramda不同的是,他没有提供很多功能函数


如果要获取文件中数据的 version 字段,可以直接在这個onResolved回调中处理数据但是这样并不符合函数式编程。

  • Ponited函子是实现了 of 静态方法的函子
  • of 方法是为了避免使用 new 来创建对象更深层的含义是把值放到上下文 Context (把值放到容器中,使用 map 来处理值)

我要回帖

更多关于 33乘以8等于多少 的文章

 

随机推荐