我一直在寻找这个问题的答案,并找到this blog post。它说fail
优于error
,因为它不受IO
monad的限制。
我应该在代码中使用fail
代替error
吗? fail
中有Control.Exception.catch
个IO
个例外情况吗?
编辑:我找到了上面链接的an update。
答案 0 :(得分:7)
这是我的建议:
如果您已使用IO
代码,请通过throwIO
的{{1}}使用正确的例外情况。
如果您的代码已经使用了monad堆栈,如果它已经不支持monad堆栈,请添加错误,并使用它们。
如果您使用非monadic代码,请编写总函数。即,如果可以,请避免使用Control.Exception
和不完整的模式。在这里使用error
只会强制您的代码不必要的monadic。如果您需要特殊结果,请使用正确的数据类型(例如fail
或Maybe
或自定义数据类型)。