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

Ech*_*lan 2 haskell ghc haskell-stack

我看到这个答案这一个,"一切都可怕突破"和堆栈不会让我代替基地,但它让我代替字节字符串.这有什么问题?有没有办法安全地做到这一点,而无需重新编译GHC?我正在调试基本库的问题,这将非常方便.

NB当我说我想取代base我指的是修改后的版本base同一 GHC版本.我正在调试库,而不是针对不同的GHC版本测试程序.

Dan*_*ner 5

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

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

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

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

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