转载

Monad备忘录

最近需要补的东西较多,疏于打理关于Monad的学习笔记,所以赶在到公历新年前,先整理出一部分,以备忘:

是什么?

A monad is just a monoid in the category of endofunctors, what’s the problem?

单子 不过是一个自函子范畴上的半幺群

Monad备忘录 (monad,也译单体)是函数式编程中的一种抽象数据类型,其特别之处在于,它是用来表示计算而不是数据的。在以函数式风格编写的程序中,单子可以用来组织包含有序操作的过程,或者用来定义任意的控制流(比如处理并发、异常、延续)。

定义

单子的构造包括定义两个操作return和bind(在有的语言里是unit/id和flatMap),还有一个必须满足若干性质的类型构造器M。

Monad三公理:

  1. bind(unit(x), f) ≡ f(x)
  2. bind(m, unit) ≡ m
  3. bind(bind(m, f), g) ≡ bind(m, x ⇒ bind(f(x), g))

简化理解

Monad 可以理解为 可连接的运算符 ,或者 可连接的对值进行操作的上下文

  • 熟悉JS的话,Promise是一个切入点,它实实在在就是Monad的实现
  • 在Haskell里,Monad是一个class,里面定义了一个 >>= 方法:
(>>=) :: m a -> (a -> m b) ->m b

使用它,可以轻松的实现可连接的运算:

Prelude> [2, 4, 6] >>= (/x -> [x*x]) >>= (/x -> [x-1])

输出:

[3,15,35]

可参考的资料

  • Motivation for Monads
  • Demystifying the Monad in Scala
  • Functor、Applicative 和 Monad
  • Functors, Applicatives, And Monads In Pictures
  • 什么是Monad?
  • 什么是Monoid?
  • Monad 最简介绍
  • 怎样用简单的语言解释 monad?
  • 关于 Monad 的学习笔记
  • Scala和范畴论 — 对Monad的一点认识
  • 我所理解的monad(5):自函子(Endofunctor)是什么
原文  http://www.moye.me/2016/12/11/memo-of-monad/
正文到此结束
Loading...