莫纳德的"左单位法":
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吗?
首先,monad法则假定f: A => M[A](这里f: A => List[A]).事实并非如此(x: Int) => Some[Int](x).
其次,List的flatMap是不是一元的绑定.它比绑定更通用,因为它采用隐式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)
| 归档时间: |
|
| 查看次数: |
180 次 |
| 最近记录: |