繁体   English   中英

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

[英]A type constructor IS a monad or HAS a monad?

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

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


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

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

  • monad是三元组(T, return, bind)这样(...)。 当可以从上下文推断出bindreturn ,我们只将monad称为T

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

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

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

实际上,对于给定类型的构造函数T ,可能存在多个不同的returnbind定义,这些定义构成了monad。 为了避免每次都指的是三人间,我们可以给T不同的名称来消除歧义,在对应于一种方式newtype在Haskell结构。 例如: [] vs ZipListState 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM