类型构造函数是 monad 还是 HAS monad?

A type constructor IS a monad or HAS a monad?

人们通常说类型是 monad。

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


你通常可以在数学中找到它。

  • 一个 monad 是一个三元组 (T, return, bind) 使得 (...)。当 bindreturn 可以从上下文中推断出来时,我们只是将 monad 称为 T.

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

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

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

所以确实,对于给定的类型构造函数 T 可能有多个不同的 returnbind 定义构成了一个 monad。为了避免每次都引用三元组,我们可以给 T 不同的名称来消除歧义,其方式与 Haskell 中的 newtype 结构相对应。例如:[]ZipListState sReaderT s (Writer s).


P.S。说 monad 或 monoid 是三元组有些人为的,特别是考虑到有不同的表示:我们也可以说 monad 是三元组 (T, fmap, join),或者 monoid 是一对 (M, •),身份元素隐藏在额外的条件中(因为无论如何它是由 唯一确定的)。数学结构的 ontology 是一个更哲学的问题,不在 SO 的范围内(也不在我的专业知识范围内)。但重新制定此类定义的更谨慎的方法可能是说 "a monad is (defined|characterized) by a triple (T, return, bind)".

就您询问的语言用法而言,Google says that the phrase “has a monad” 似乎并不以您询问的方式常用。大多数真实事件出现在诸如“The Haskell community has a monad problem”这样的句子中。然而,在野外确实存在一些模糊相似用法的情况,例如,“唯一使它成为‘monadic’的是它有一个 Monad 实例。”也就是说,monad 经常被用作 monadic 的同义词,修改一些其他名词来产生一个短语(一个 monad 问题,一个 Monad instance) 有时用作动词 have.

的宾语

关于编码:在Haskell中,一个类型可以声明Monad中的一个instanceMonoid中的一个等等。当一个给定的类型可以定义许多这样的实例时,例如数字在加法、乘法、最大值、最小值和许多其他操作下如何是幺半群,Haskell 定义单独的类型,例如 Sum Int,[= Int 上的 14=] 实例,其中操作是 +,以及 Product Int,一个 Monoid 实例,其中操作是 *.

虽然我没有全面检查数以万计的点击率,所以很可能那里有更好的例子来说明你问的问题。

我经常看到的措辞是我刚刚使用的措辞:a type is a 类别 一个操作