一个类型构造函数是一个monad还是一个monad?

Seb*_*ber 5 language-agnostic haskell functional-programming scala category-theory

人们通常说一种类型是一个单子.

在某些函数式语言和库(如Scala/Scalaz)中,您有一个类型构造函数,如List或Option,您可以定义与原始类型分离的Monad实现.所以基本上没有什么禁止你在类型系统中为同一类型的构造函数创建Monad的不同实例.


  • 类型构造函数可能有多个monad吗?
  • 如果是的话,你能提供任何有意义的例子吗?任何"人造的"?
  • 关于幺半群,应用程序......?

Li-*_*Xia 14

你通常可以在数学中找到这一点.

  • monad是三元组(T, return, bind)(...).当bindreturn可以从上下文推断出来,我们只是指的是单子的T.

  • 幺半群是三元组(M, e, •)(...).(...)我们只是将幺半群称为M.

  • 拓扑空间是一对(S, T)(...).我们只是将拓扑空间称为S.

  • 戒指是一个元组(V, 0, +, 1, ×)......

实际上,对于给定的类型构造函数T,可能存在多个不同的定义return并且bind构成monad.为了避免每次都必须引用三元组,我们可以T以与newtypeHaskell中的构造相对应的方式给出不同的名称以消除歧义.例如:[]vs ZipList,State svs ReaderT s (Writer s).


PS有一些人为的说monad或monoid是三元组,特别是考虑到有不同的演示:我们也可以说monad是三元组(T, fmap, join),或者monoid是一对(M, •),其中的identity元素隐藏在额外条件(因为它无论如何都是唯一确定的).数学结构的本体论是一个更为哲学的问题,超出了SO的范围(以及我的专业知识之外).但是,一种更谨慎的方式来重新定义这样的定义可能就是说"一个单子格(由一个三元组定义)(T, return, bind)".

  • 在数学中,是的; 但是在Haskell中,只能为给定类型定义一个Monad实例.但是,在Haskell中还有`newtype`,允许我们用不同的名称调用相同的类型; 对于这个新名称,我们*可以*定义另一个Monad实例.`ZipList`是一个例子(只是它是Applicative,而不是Monad,但它是相同的原则). (3认同)