Monad

Monad免费看

Monad 是什么,Monad中flatten、map 和 context的 定义,什么是函数组合

2018-08-31侠课岛    中级进阶       

前端/前端/ES6函数式编程 9     0     1186

Monad 是一种将函子组合应用的方法,它需要一个 context。常见的 Monad 有计算任务、分支任务、或者 I/O 操作。 Monadtype lift(类型提升),flatten(展平)以及 map(映射)操作使得数据类型统一,从而实现了,即便组合链中存在 a => M(b) 这样的类型提升,函数仍然可组合。a => M(b) 是一个伴随着某个计算 context 的映射过程,Monad 通过 type liftflattenmap 完成.

flattenmapcontext 定义:

  • map 指的是应用一个函数接收参数a,返回 b。即传入某参数,返回某输出 a => b
  • context 是一个 Monad 组合(包括 type liftflattenmap )的计算细节。 Functor/MonadAPI 用到了 context,这些 API 允许你在应用的某些部分组合 MonadFunctorMonad 的核心在于将 context 进行抽象,使我们在进行组合的时候不需要关注其中细节。在 context 内部进行 map 意味着你可以在 context 内部应用一个 map 函数完成 a => b,而新返回的 b 又被包裹了相同的 context
  • type lift 指的是将一个类型提升到对应的 context 中。类型提升可以描述为 a => F(a)
  • flatten 指的是去除值的 context 包裹。即 F(a) => a

下面举一个例子,对一个数组里面的每个数组进行*2操作。

const arr = Array.of(1,2,3);
const fn = num => num * 2; // +3函数
let result = arr.map(fn) // 使用arr.map进行遍历
console.log(result)  // [ 2, 4, 6 ]

在这个例子中,Array 就是 contextx 是进行 map 的值,这就是一个简单的函数式编程,你只需要编写逻辑处理函数fn,不需要关心实现细节

组合函数

什么是函数组合?就是将需要嵌套执行的函数平铺。嵌套执行指的是,一个函数的返回值将作为另一个函数的参数。

看下面的例子,组合简单函数非常容易,因为函数的输入输出都有一致的类型。只要g函数的输入类型b和f函数的输入参数b为一致,就能通过组合函数从输入a得到c:

g: a => b
f: b => c
h = f(g(a)): a => c

下面的例子是 M(a) => M(b),使用 Functor 的组合也很容易完成,这个是在上面的基础加上了context F:

g: F(a) => F(b)
f: F(b) => F(c)
h = f(g(Fa)):  F(a) =>  F(c)

但是如果你想要从 a => M(b)b => M(c) 这样的形式进行函数组合,你就需要 Monad。F和M其实是相同的就是 context,换成 M 是为了更易于代入:

g: a => M(b)
f: b => M(c)
h = composeM(f, g): a => M(c)

本教程图文或视频等内容版权归侠课岛所有,任何机构、媒体、网站或个人未经本网协议授权不得转载、转贴或以其他方式复制发布或发表。

评价

9

本课评分:
  •     非常好
难易程度:
  •     适中的
|
教程
粉丝
主页

签到有礼

已签到2天,连续签到7天即可领取7天全站VIP

  • 1
    +2 金币
  • 2
    +3 金币
  • 3
    +5 金币
  • 6
    +7 金币
  • 5
    +6 金币
  • 4
    暖心福利
    自选分类VIP ×1天
  • 7
    惊喜大礼

    自选分类VIP ×3天 +20金币
  • 持续签到 +8 金币

金币可以用来做什么?