【发布时间】:2011-12-31 02:54:13
【问题描述】:
我对 Haskell 还很陌生,并且慢慢地意识到 Monad fail 的存在有问题。 Real World Haskell warns against its use(“再一次,我们建议您几乎总是避免使用失败!”)。我今天刚刚注意到,Ross Paterson 将其称为“一个缺陷,而不是一种设计模式”back in 2008(并且似乎在该线程中达成了相当的一致)。
在观看 Ralf Lämmel 博士 talk on the essence of functional programming 时,我开始理解可能导致 Monad 失败的紧张局势。在讲座中,Ralf 谈到了将各种 monadic 效果添加到基本 monadic 解析器(日志记录、状态等)。许多效果需要更改基本解析器,有时还需要更改使用的数据类型。我认为向所有 monad 添加 'fail' 可能是一种妥协,因为 'fail' 是如此普遍,并且您希望尽可能避免更改 'base' 解析器(或其他)。当然,某种“失败”对解析器来说是有意义的,但并非总是如此,例如,状态的 put/get 或 Reader 的 ask/local。
如果我走错了路,请告诉我。
我应该避免使用 Monad 失败吗? Monad失败的替代方案是什么? 是否有任何不包含此“设计疣”的替代 monad 库? 我在哪里可以了解有关此设计决策的历史的更多信息?
【问题讨论】:
-
Real World Haskell says "[在许多 monads 中]
fail使用error。调用error通常是非常不可取的,因为它会引发调用者无法捕获或不会期望的异常。" -
我相信当你这样处理模式匹配失败时需要“失败”:“Just x
-
@Paul Johnson 为什么? GHC 运行时将愉快地在模式匹配失败时使常规函数崩溃。仅在 monad 实例具有捕获该错误的能力的情况下才需要,这是一种并非真正专属于或普遍存在于 monad 的 hack。
-
你应该使用
MonadFail