单子的左单位法似乎不适用于斯卡拉的列表.scala列表不是monad吗?

Vas*_*802 3 monads scala

莫纳德的"左单位法":

unit(x) flatMap f == f(x)
Run Code Online (Sandbox Code Playgroud)

但:

(List(1) flatMap ((x: Int) => Some[Int](x))) == List(1) // true
((x: Int) => Some[Int](x))(1) == Some(1) // also true
Run Code Online (Sandbox Code Playgroud)

所以左单位法并不适用于斯卡拉的名单.列表不是monad吗?

HTN*_*TNW 8

首先,monad法则假定f: A => M[A](这里f: A => List[A]).事实并非如此(x: Int) => Some[Int](x).

其次,ListflatMap不是一元的绑定.它比绑定更通用,因为它采用隐式CanBuildFrom允许它根据您希望它返回的内容来更改其返回类型.您可以将其限制为绑定

def bind[A](xs: List[A])(f: A => List[A]) = xs.flatMap(f) // implicit (List.canBuildFrom)
Run Code Online (Sandbox Code Playgroud)

现在你可以看到法律得到满足:

bind(List(1))(x => List(x, x)) == List(1, 1)
Run Code Online (Sandbox Code Playgroud)