要将 IO 函数添加到用 Haskell 编写的编程语言解释器中,我基本上有两种选择:
- 修改整个解释器以在 IO monad 内部运行
- 让解释程序可以调用的运行时函数使用
unsafePerformIO
.
前者对我来说是个坏主意——这实际上抵消了程序中几乎所有地方的任何 纯度优势。IO
我目前也ST
大量使用,并且必须修改大量程序才能实现这一点,因为我看不到同时使用两者ST
(IO
?)。
后者让我感到紧张——正如函数名称所述,它是不安全的,但我认为在这种情况下它可能是合理的。特别:
- 此更改涉及的代码量将非常少。
- 可以执行 IO 的点已经通过在
seq
解释表达式求值期间使用 at 控制点来显式排序。 - 或许更重要的是,IO 操作返回的值只会在代码的解释部分中使用,我可以通过解释器不能使用相同的参数多次调用这一事实来保证引用透明性,因为操作计数器将通过线程整个系统作为同一更改的一部分,并且始终以唯一值传递给将使用
unsafePerformIO
.
在这种情况下,有充分的理由不使用unsafePerformIO
吗?
更新
有人问我为什么要保持口译员的纯洁性。原因有很多,但也许最紧迫的是我打算以后为这种语言构建一个编译器,该语言将包含各种元编程技术,这些技术将要求编译器包含解释器,但我想成为能够保证编译结果的纯度。为此目的,该语言将有一个纯子集,我希望解释器在执行该子集时是纯的。