Monad和函数式编程之我问
Q: 什么是引用透明?
A: 同样的输入,永远有同样的输出
Q: 为什么Option类型可以规避异常?
A: 空指针异常占了异常里很大一部分,而原因在于每个类型都可以为空, 如果一个语言规定了所有的类型默认不能为空,那如果我们想要使用空对象,就必须有一个合适的理由,然后使用Option类型的话类型系统也会强制我们去handle这个可能发生的空指针异常
A: 以上是从表象角度来分析, 而从本质(抽象)角度来说: 如果我们用函数式的方式来处理异常,就永远不会产生异常, 而option正是这样一个函数式编程工具. 那么函数式编程怎么处理异常呢?由于输入和输出的绝对一致性要求(引用透明的要求), 我们要求函数不能抛出异常,我们想要它返回唯一可预测的值,而不是异常. 那怎么办呢? 所以这里我们返回薛定谔类型, 表示它可能是异常或者是正确的返回值,需要注意的是,这样的返回是符合引用透明的, option就属于薛定谔类型, 我们可以返回一个Option x, 如果发生异常时返回Option.Null, 如果没有异常就返回x.
Q: 如何将javascrip转成纯函数语言?
- 首先杜绝状态变化,杜绝var和let
- 杜绝loop,loop必然发生状态变化
- list & object 一旦创建,就不要更改,freeze them
- 杜绝使用Date和Random(显然是不可能的)
Q: 如果全部状态都不可变,如何真实反应一个持续变化的世界?
A: ❌使用Monad
Q: Monad的本质是什么?
A: 本质是薛定谔输入和已存在函数和解的桥梁.
Q: Monad是怎么真实反应一个持续变化世界的,解决了什么问题?
A: Monad没有真实反应一个持续变化的世界,薛定谔输入反映了一个持续变化的世界
Q: unit.lift 是什么?
A: 首先unit是一个monad constructor, unit.lift接受一个函数f, 一旦unit被传入v调用生成了monad, 调用monad.f的结果就是一个新的monad, 值为f(v)
Q: 什么是Monad?
A: Monad is an object.
Q: 函数式编程怎么回避divide 0异常?
A: 回避不了