Seb*_*ber 5 language-agnostic haskell functional-programming scala category-theory
人们通常说一种类型是一个单子.
在某些函数式语言和库(如Scala/Scalaz)中,您有一个类型构造函数,如List或Option,您可以定义与原始类型分离的Monad实现.所以基本上没有什么禁止你在类型系统中为同一类型的构造函数创建Monad的不同实例.
Li-*_*Xia 14
你通常可以在数学中找到这一点.
monad是三元组(T, return, bind)
(...).当bind
且return
可以从上下文推断出来,我们只是指的是单子的T
.
幺半群是三元组(M, e, •)
(...).(...)我们只是将幺半群称为M
.
拓扑空间是一对(S, T)
(...).我们只是将拓扑空间称为S
.
戒指是一个元组(V, 0, +, 1, ×)
......
实际上,对于给定的类型构造函数T
,可能存在多个不同的定义return
并且bind
构成monad.为了避免每次都必须引用三元组,我们可以T
以与newtype
Haskell中的构造相对应的方式给出不同的名称以消除歧义.例如:[]
vs ZipList
,State s
vs ReaderT s (Writer s)
.
PS有一些人为的说monad或monoid是三元组,特别是考虑到有不同的演示:我们也可以说monad是三元组(T, fmap, join)
,或者monoid是一对(M, •)
,其中的identity元素隐藏在额外条件(因为它•
无论如何都是唯一确定的).数学结构的本体论是一个更为哲学的问题,超出了SO的范围(以及我的专业知识之外).但是,一种更谨慎的方式来重新定义这样的定义可能就是说"一个单子格(由一个三元组定义)(T, return, bind)
".