monadic集合,monadic类型和monadic操作有什么区别?

时间:2018-01-28 09:29:11

标签: scala monads

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

1 个答案:

答案 0 :(得分:7)

  

monadic集合是否支持非monadic操作

monadic集合必须定义两种方法:RegExppure。最重要的是,它必须遵守Monad的身份法(左右)和相关性。

此类集合在Scala中为bind,其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

Assosiativity:

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 还支持其他不属于Monad定义的操作,例如List[A](由map事件免费提供的是{mon} ,每个monad也是一个算符),List[A]filter等。

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

更具体地说,我们可以说foldLeft是一个monadic集合,实现 List[A]类型类,而是一个 monadic类型有monadic操作。