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 集合必须定义两个方法:pure
和 bind
。最重要的是,它必须遵守身份(右和左)和结合性的 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 定义的操作,例如 map
(List[A]
是免费提供的一个 monad,每个 monad 也是一个函子),filter
,foldLeft
,等等
回答您的问题:是的,具有 monadic 属性的集合可以支持的不仅仅是 monad 定义的操作。
更具体地说,我们可以说 List[A]
是一个单子集合,它 实现了 Monad[List]
类型类,因此 是一个 具有单子操作的单子类型。
我一直在努力理解 scala 中 monad 的概念。有与 monad 相关的不同术语。单子类型类、单子类型、单子操作、单子集合等。 所以我有这样的问题 Monadic 集合可以支持非 monadic 操作吗? 是否有可能揭开 scala 中与 monad 相关的不同术语的神秘面纱?
Can a monadic collection support a non-monadic operation
一个 monadic 集合必须定义两个方法:pure
和 bind
。最重要的是,它必须遵守身份(右和左)和结合性的 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 定义的操作,例如 map
(List[A]
是免费提供的一个 monad,每个 monad 也是一个函子),filter
,foldLeft
,等等
回答您的问题:是的,具有 monadic 属性的集合可以支持的不仅仅是 monad 定义的操作。
更具体地说,我们可以说 List[A]
是一个单子集合,它 实现了 Monad[List]
类型类,因此 是一个 具有单子操作的单子类型。