人们通常会说一种类型是monad。
在某些函数式语言和库(如Scala / Scalaz)中,您有一个类型构造函数,如List或Option,您可以定义与原始类型分离的Monad实现。所以基本上没有什么禁止你在类型系统中为同一类型的构造函数创建Monad的不同实例。
答案 0 :(得分:14)
你通常可以在数学中找到这一点。
monad是三(T, return, bind)
,这样(...)。如果可以从上下文中推断出bind
和return
,我们只需将monad称为T
。
幺半群是三(M, e, •)
,这样(...)。 (...)我们只将幺半群称为M
。
拓扑空间是一对(S, T)
,这样(...)。我们只将拓扑空间称为S
。
戒指是元组(V, 0, +, 1, ×)
...
的确,对于给定类型的构造函数T
,可能有多个不同的return
和bind
定义构成一个monad。为了避免每次都必须引用三元组,我们可以使用T
个不同的名称来消除歧义,其方式与Haskell中的newtype
构造相对应。例如:[]
vs ZipList
,State s
vs ReaderT s (Writer s)
。
P.S。有一些人为的说monad或monoid是三元组,特别是考虑到有不同的演示:我们也可以说monad是三(T, fmap, join)
,或者monoid是一对{{1将identity元素隐藏在额外条件中(因为它始终由(M, •)
唯一确定)。数学结构的本体论是一个更为哲学的问题,超出了SO的范围(以及我的专业知识之外)。但是,一种更谨慎的方式来重新定义这样的定义可能就是说" monad是(定义的)由三•
"来定义的。
答案 1 :(得分:2)
就您询问语言使用情况而言,Google says that the phrase “has a monad”似乎并不常用于您所询问的方式。大多数真实事件都出现在句子中,例如“Haskell社区有一个monad 问题。”然而,在野外确实存在一些模糊相似的例子,例如“唯一的东西它'monadic'是它有一个Monad
实例。“也就是说, monad 经常被用作 monadic 的同义词,修改一些其他名词来产生一个短语(一个monad问题,一个Monad
实例),有时用作动词的对象。
至于编码:在Haskell中,类型可以声明一个instance
Monad
,Monoid
之一,依此类推。当给定类型可以定义许多这样的实例时,例如数字是加法,乘法,最大,最小和许多其他操作的幺半群,Haskell定义了不同的类型,例如Sum Int
,Monoid
实例在操作为Int
的{{1}}之上,以及+
,操作为Product Int
的{{1}}实例。
尽管如此,我还没有全面检查过成千上万的点击量,因此很有可能会有更好的例子来说明你的问题。
我经常看到的那句话就是我刚才使用的词语:类型 类别 < / strong> 操作。