Haskell程序的可移植性和不纯行为

时间:2015-11-03 22:57:09

标签: haskell

我的理解是,除非代码评估为所谓的bottom,否则参考透明度在Haskell中保留。

但事情发生在现实世界中。内存是有限的,线程可能会被中断,异步异常会被抛出,虚假中断可能会唤醒线程,信号,被零除等等......

我不确定Haskell中的异常是什么意思。我知道程序员和硬件错误是异常的原因。我将使用“情境”一词来描述异常和任何其他无法在纯代码中处理的可观察程序行为(例如,我的程序终止的原因)。

我理解每个非纯粹的情况都要在IO中处理,因为运行时间继续执行程序。这包括从纯代码中捕获异常。到目前为止,我了解到我应该使用catchAny来防止我的程序在可能的情况下终止。 GHC以任何方式都是特别的吗?哪些运行时情况可以保证“捕获”而哪些不可以?

一般情况下,对于哪些不纯的情况,Haskell规范保证程序能够以便携方式检测和处理的API?实现和架构还剩下什么?

1 个答案:

答案 0 :(得分:2)

Haskell 保证的明确规范是the Haskell 2010 Report。这定义了语言本身的语法和含义,并且还指定了一组微小的标准库,这些库是兼容的计算机或解释器应该提供的。

特别是,ioError由报告指定。它包含try函数,它抛出指定的I / O异常,函数catchControl.Exception处理I / O异常。任何其他类型的异常完全不受影响。

现在, GHC 提供了git fetch ; git merge,它定义了一大堆额外的类型和函数来处理各种异常 - 算术错误(例如,除以零),内存,无限循环,死锁,用户中断(即按Ctrl + C),依此类推。这是GHC特有的,原则上是非便携式的。

请注意,实际上,GHC基本上是唯一的生产级编译器。曾几何时,还有其他人,但他们似乎都已黯然失色。在实践中,GHC是唯一困扰目标的编译器(除非他们做的事情非常特殊)。正如Daniel Wagner指出的那样,相当大的Hackage只能用GHC编译。

如果您有兴趣了解更多有关便携性的信息,我建议您提出一个更有针对性的问题。如果GHC异常处理让您感到困惑,请提出更具体的问题。

如果您要求跨操作系统的中止可移植性...... GHC在它支持的所有平台上实现相同的功能。