为什么我不能替换GHC分发的库?如果我做了会怎么样?

时间:2016-04-27 19:50:49

标签: haskell ghc haskell-stack

我在this answerthis one中看到“一切都会破坏”,Stack不会让我替换base,但它会让我替换bytestring。这有什么问题?有没有办法安全地做到这一点,而无需重新编译GHC?我正在调试基本库的问题,这非常方便。

N.B。当我说我要替换base时,我的意思是来自相同的 GHC版本的base的修改版本。我正在调试库,而不是针对不同的GHC版本测试程序。

1 个答案:

答案 0 :(得分:5)

大多数库是包含Haskell代码的Haskell模块的集合。这些库的含义由模块中的代码决定。

虽然base包有点不同。它提供的许多功能和数据类型都是在标准Haskell中实现的 not ;它们的含义不是由包中包含的代码给出的,而是由编译器本身给出的。如果查看base包(以及其他引导库)的来源,您将看到许多操作,其完整定义只是undefined。编译器运行时系统中的特殊代码实现了这些操作并公开它们。

例如,如果编译器没有提供seq作为基本操作,那么事后就无法实现seq:没有你可以编写的Haskell术语down将具有与seq相同的类型和语义,除非它使用seq(或根据seq定义的Haskell扩展之一)。同样,许多指针操作,ST操作,并发原语等都在编译器本身中实现。

这些操作不仅通常无法实现,而且通常与编译器的内部数据结构密切相关,后者从一个版本更改为下一个版本。因此,即使您设法说服GHC使用来自不同(版本的)编译器的base包,最可能的结果只是内部数据结构损坏,具有不可预测(并且可能是灾难性的)结果 - 竞争条件,垃圾记忆,空间泄漏,段错误,那种事情。

如果您需要多个版本的基础,只需安装几个版本的GHC。它经过精心设计,因此多个版本可以在一台机器上和平共存。 (特别是安装多个版本肯定不需要重新编译GHC,甚至不需要首次编译GHC,这似乎是您的主要关注点。)