Haskell中的异常如何工作?

时间:2012-06-17 10:40:54

标签: exception haskell

在GHCi中:

Prelude> error (error "")
*** Exception: 
Prelude> (error . error) ""
*** Exception: *** Exception: 

为什么第一个不是嵌套异常?

1 个答案:

答案 0 :(得分:100)

答案是,这是不精确异常的(有些令人惊讶的)语义

当纯代码可以显示为评估异常值的时(即errorundefined的值,并且显式那种异常generated in IO),然后语言允许返回该集合的任何值。 Haskell中的异常值更像是浮点代码中的NaN,而不是命令式语言中基于控制流的异常。

即使是先进的Haskellers偶尔也会遇到如下情况:

 case x of
   1 -> error "One"
   _ -> error "Not one"

由于代码评估为一组异常,GHC可以自由选择一个。通过优化,您可能会发现它总是评估为“不是一个”。

为什么我们这样做?因为否则我们会过度约束语言的评估顺序,例如我们必须确定一个确定性结果:

 f (error "a") (error "b")
例如,

如果存在错误值,则要求从左到右进行评估。非常不喜欢Haskelly!

由于我们不希望削弱可以对我们的代码进行的优化以支持error,因此解决方案是指定结果是来自异常值集的非确定性选择:不精确的例外!在某种程度上,返回所有异常,并选择一个。

通常,你不在乎 - 异常是一个例外 - 除非你关心异常中的字符串,在这种情况下使用error进行调试是非常困惑的。


参考文献:A semantics for imprecise exceptions,Simon Peyton Jones,Alastair Reid,Tony Hoare,Simon Marlow,Fergus Henderson。 Proc编程语言设计与实现(PLDI'99),亚特兰大。 (PDF