我一直在努力理解scala中monad的概念。有与monad相关的不同术语。 Monadic类型,monadic类型,monadic操作,monadic收集等。 所以我有一些问题,如monadic集合是否支持非monadic操作? 是否有可能揭开与scala中monad相关的不同术语的神秘面纱?
答案 0 :(得分:7)
monadic集合是否支持非monadic操作
monadic集合必须定义两种方法:RegExp
和pure
。最重要的是,它必须遵守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
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操作。