monadic 集合、monadic 类型和monadic 操作之间有什么区别?

what is difference between monadic collection, monadic type and monadic operation?

我一直在努力理解 scala 中 monad 的概念。有与 monad 相关的不同术语。单子类型类、单子类型、单子操作、单子集合等。 所以我有这样的问题 Monadic 集合可以支持非 monadic 操作吗? 是否有可能揭开 scala 中与 monad 相关的不同术语的神秘面纱?

Can a monadic collection support a non-monadic operation

一个 monadic 集合必须定义两个方法:purebind。最重要的是,它必须遵守身份(右和左)和结合性的 Monad 法则。

这样的集合在 Scala 中是 List[A],通过它的应用方法有 pure

val l: List[Int] = List(1,2,3)

flatMap (bind):

val flat = l.flatMap(i => List(i))

规律:

左身份:

val f: Int => List[Int] = x => List(x + 1)

val x = 1
val left = List(x).flatMap(f)
val right = f(x)

left == right

正确身份:

val y = List(1)
val left = y.flatMap(List(_))
val right = y

left == right

关联性:

val f: Int => List[Int] = x => List(x + 1)
val g: Int => List[Int] = x => List(x + 2)

val list = List(1,2,3)
val left = list.flatMap(f).flatMap(g)
val right = list.flatMap(x => f(x).flatMap(g))

left == right

如您所见,List[A] 还支持其他不属于 Monad 定义的操作,例如 mapList[A] 是免费提供的一个 monad,每个 monad 也是一个函子),filterfoldLeft,等等

回答您的问题:是的,具有 monadic 属性的集合可以支持的不仅仅是 monad 定义的操作。

更具体地说,我们可以说 List[A] 是一个单子集合,它 实现了 Monad[List] 类型类,因此 是一个 具有单子操作的单子类型。