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

use*_*182 1 monads scala

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

Yuv*_*kov 7

monadic集合可以支持非monadic操作

monadic集合必须定义两种方法:purebind.最重要的是,它必须遵守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)

Assosiativity:

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]类型类,并通过一个具有一元一元的操作类型.