一份 monad cheat sheet.
以前在别人的一篇 blog 里看到过有这样一句话,大意是:关于 monad,几乎每个在学习函数式编程中接触到这个模式的,都会写一篇博客描述他的理解。而且不同的人对 monad 的理解有所不同(暗讽 monad 的复杂)。
所以咱也来写一份!尽管 monad(单子)是一个来源于范畴论的概念(在范畴论中它被定义为「自函子范畴上的幺半群」),若没有接触过范畴论可能会觉得这份定义很难理解,然而在实际编程中,我们只需要数行代码就可以构造出「幺半群」、「函子」和「单子」。
本文将首先用 TypeScript 构造出「幺半群」、「函子」和「单子」及相关示例,然后再(尝试)解释这些概念。因为我们只需要在「程序语言的类型」这一具体语境下使用范畴论的一些概念,所以这里的「范畴论知识」也某种程度上被特化了,我们不会涉及到范畴论中的全部抽象。