我一直试图理解scala中monad的概念.有与monad相关的不同术语.Monadic类型,monadic类型,monadic操作,monadic集合等所以我有一些问题,如monadic集合是否支持非monadic操作?是否有可能揭开scala中与monad相关的不同术语的神秘面纱?
monadic集合可以支持非monadic操作
monadic集合必须定义两种方法:pure和bind.最重要的是,它必须遵守Monad的身份法(左右)和相关性.
这样的集合List[A]在Scala中,pure通过它的apply方法:
val l: List[Int] = List(1,2,3)
Run Code Online (Sandbox Code Playgroud)
和flatMap(bind):
val flat = l.flatMap(i => List(i))
Run Code Online (Sandbox Code Playgroud)
val f: Int => List[Int] = x => List(x + 1)
val x = 1
val left = List(x).flatMap(f)
val right = f(x)
left == right
Run Code Online (Sandbox Code Playgroud)
val y = List(1)
val left = y.flatMap(List(_))
val right = y
left == right
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,List[A]也支持其他操作,这些操作都没有单子定义的一部分,如map(这是考虑了免费的事实List[A]是一个单子,每一个单子也是一个仿函数)filter,foldLeft等等.
回答你的问题:是的,具有monadic属性的集合可以支持的不仅仅是monad定义的操作.
更具体地讲,我们可以说,List[A]是一个一元收集其实现的Monad[List]类型类,并通过一个具有一元一元的操作类型.