我的理解是,除非代码评估为所谓的bottom
,否则参考透明度在Haskell中保留。
但事情发生在现实世界中。内存是有限的,线程可能会被中断,异步异常会被抛出,虚假中断可能会唤醒线程,信号,被零除等等......
我不确定Haskell中的异常是什么意思。我知道程序员和硬件错误是异常的原因。我将使用“情境”一词来描述异常和任何其他无法在纯代码中处理的可观察程序行为(例如,我的程序终止的原因)。
我理解每个非纯粹的情况都要在IO
中处理,因为运行时间继续执行程序。这包括从纯代码中捕获异常。到目前为止,我了解到我应该使用catchAny
来防止我的程序在可能的情况下终止。 GHC
以任何方式都是特别的吗?哪些运行时情况可以保证“捕获”而哪些不可以?
一般情况下,对于哪些不纯的情况,Haskell规范保证程序能够以便携方式检测和处理的API?实现和架构还剩下什么?
答案 0 :(得分:2)
Haskell 保证的明确规范是the Haskell 2010 Report。这定义了语言本身的语法和含义,并且还指定了一组微小的标准库,这些库是兼容的计算机或解释器应该提供的。
特别是,ioError
由报告指定。它包含try
函数,它抛出指定的I / O异常,函数catch
和Control.Exception
,仅处理I / O异常。任何其他类型的异常完全不受影响。
现在, GHC 提供了git fetch ; git merge
,它定义了一大堆额外的类型和函数来处理各种异常 - 算术错误(例如,除以零),内存,无限循环,死锁,用户中断(即按Ctrl + C),依此类推。这是GHC特有的,原则上是非便携式的。
请注意,实际上,GHC基本上是唯一的生产级编译器。曾几何时,还有其他人,但他们似乎都已黯然失色。在实践中,GHC是唯一困扰目标的编译器(除非他们做的事情非常特殊)。正如Daniel Wagner指出的那样,相当大的Hackage只能用GHC编译。
如果您有兴趣了解更多有关便携性的信息,我建议您提出一个更有针对性的问题。如果GHC异常处理让您感到困惑,请提出更具体的问题。
如果您要求跨操作系统的中止可移植性...... GHC在它支持的所有平台上实现相同的功能。