所以我有这行代码:
[Nothing] >>= \(Just x) -> [x]
这当然给出了例外,因为模式不匹配任何内容。
另一方面,这段代码给出了不同的结果,[]:
do
Just x <- [Nothing]
return x
正如我所看到的,它们应该产生相同的结果,因为应该将 do-blocks 减少为使用 (>>=) 并返回。但事实并非如此,使 do-notation 成为一种功能而不是语法糖。
我知道 monad 类型类中存在 fail 并且我知道当模式匹配在 do-block 中失败时会调用它,但我不明白为什么它是一种与使用普通 monad 操作不同的想要的行为。
所以我的问题是 - 为什么失败方法应该存在?