【发布时间】:2018-01-13 11:49:27
【问题描述】:
人们通常说类型是单子。
在一些函数式语言和库(如 Scala/Scalaz)中,您有一个类型构造函数,如 List 或 Option,您可以定义一个与原始类型分离的 Monad 实现。所以基本上没有什么禁止你在类型系统中为同一个类型构造函数创建不同的 Monad 实例。
- 类型构造函数可以有多个单子吗?
- 如果是,您能提供任何有意义的例子吗?任何“人造”的?
- 幺半群、应用程序呢...?
【问题讨论】:
-
Monad instances aren't unique。类型系统不允许一种类型有多个实例,但您可以使用 newtype 定义新实例。
-
谢谢@Cubic。我会尝试阅读,但目前我对 Haskell 不太熟悉。这个问题与语言完全无关
-
次要术语点:
List和Option不是类型,因为我们不能真正拥有例如def f(x: Option) = ...(我认为即使 Scala 也不允许这样做,但由于 JVM 的擦除,我不能 100% 确定)。只有例如List[Int], Option[Bool]是类型。在 Haskell 中,我们称诸如List,Option类型构造函数之类的东西,具有类型* -> *。在斯卡拉我不知道。事实上,对于像Int这样的类型,我们并没有说它是一个 monad,而不是说它有一个 monad。对于List[Int],我们可以非正式地说,它是一元类型。 -
感谢@chi 我编辑了问题
标签: scala haskell functional-programming language-agnostic category-theory