[英]A type constructor IS a monad or HAS a monad?
人们通常说一种类型是一个单子。
在某些函数式语言和库(如Scala / Scalaz)中,您有一个类型构造函数,如List或Option,您可以定义与原始类型分离的Monad实现。 所以基本上没有什么禁止你在类型系统中为同一类型的构造函数创建Monad的不同实例。
你通常可以在数学中找到这一点。
monad是三元组(T, return, bind)
这样(...)。 当可以从上下文推断出bind
和return
,我们只将monad称为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, •)
与隐藏在额外的条件(因为它是唯一被确定身份的元素•
反正)。 数学结构的本体论是一个更为哲学的问题,超出了SO的范围(以及我的专业知识之外)。 但是,重新定义这种定义的一种更谨慎的方法可能是说“一个单子格(由(T, return, bind)
定义(定义(T, return, bind)
”。
就你在询问语言使用情况而言, 谷歌表示,“有一个monad”这个短语似乎并不常用于你所询问的方式。 大多数真实事件都是在句子中,例如“Haskell社区有一个monad问题。”然而,在野外确实存在一些模糊相似的例子,例如,“使它成为'monadic'的唯一因素就是它具有Monad
实例。”也就是说, 单子常被用作一元的同义词,修改某些其他名词以产生一个短语(一个单子问题,一个Monad
实例),其有时被用作动词的对象有 。
至于编码:在Haskell中,类型可以声明一个Monad
instance
,一个Monoid
instance
,依此类推。 当给定的类型可以有定义了许多这样的实例中,如电话号码如何正在此外类群,乘法,最大值,最小值以及许多其他操作,Haskell中定义不同的类型,如Sum Int
,一个Monoid
过度实例Int
其中操作是+
和Product Int
,一个操作为*
的Monoid
实例。
我没有全面检查成千上万的点击量,所以很可能会有更好的例子来说明你所询问的内容。
我经常看到的那句话是我刚才使用的一种:一种类型 是一种操作 下的类别 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.