【发布时间】:2015-05-30 11:46:30
【问题描述】:
所以我有这行代码:
[Nothing] >>= \(Just x) -> [x]
这当然会给出异常,因为该模式与 Nothing 不匹配。
另一方面,这段代码给出了不同的结果,[]:
do
Just x <- [Nothing]
return x
在我看来,它们应该产生相同的结果,因为应该将 do-blocks 减少为使用 (>>=) 并返回。但事实并非如此,使 do-notation 成为一种特性,而不是一种语法糖。
我知道 monad 类型类中存在 fail 并且我知道当模式匹配在 do-block 中失败时会调用它,但我不明白为什么这是一种与使用正常不同的想要的行为monad 操作。
所以我的问题是 - 为什么要存在 fail 方法?
【问题讨论】:
-
还是语法糖,只是糖比你想象的要甜一点。
-
如果它真的是一个语法糖,那么它如何被减少为使用bind和return?
-
Haskell Report 对此有明确的答案。
标签: haskell pattern-matching monads do-notation