【发布时间】:2019-12-15 12:17:37
【问题描述】:
我正在努力牢牢掌握异常情况,以便改进我的conditional loop implementation。为此,我进行了各种实验,扔东西,看看会被抓到什么。
这个让我惊喜不已:
% cat X.hs
module Main where
import Control.Exception
import Control.Applicative
main = do
throw (userError "I am an IO error.") <|> print "Odd error ignored."
% ghc X.hs && ./X
...
X: user error (I am an IO error.)
% cat Y.hs
module Main where
import Control.Exception
import Control.Applicative
main = do
throwIO (userError "I am an IO error.") <|> print "Odd error ignored."
% ghc Y.hs && ./Y
...
"Odd error ignored."
我认为替代方案应该完全忽略 IO 错误。 (不知道我从哪里得到这个想法,但我当然不能提供一个在替代链中会被忽略的非 IO 异常。) 所以我想我可以手工制作并提供一个 IO 错误.事实证明,它是否被忽略取决于包装和内容:如果我 throw 一个 IO 错误,它在某种程度上不再是一个 IO 错误。
我完全迷路了。为什么它会这样工作?是有意的吗?这些定义深入到 GHC 内部模块;虽然我自己或多或少可以理解不同代码片段的含义,但我很难看到整体情况。
如果很难预测,是否应该使用这个 Alternative 实例?如果它消除任何同步异常,而不仅仅是以特定方式定义并以特定方式抛出的一小部分异常,这不是更好吗?
【问题讨论】:
-
但是写这篇文章的人对“微妙”的含义有奇怪的想法。
-
这对我来说太微妙了,我不明白其中的区别。我的代码在哪里是
seq? -
对这种循环使用
Alternative的IO实例是不习惯的。在 Java 中,这就像在 for 循环体的末尾抛出异常以推进下一次迭代。 -
@danidiaz 那么,Alternative IO 的惯用语是什么?
标签: haskell exception io-monad alternative-functor