Haskell 为什么可以';我不能替换用GHC分发的库吗?如果我这样做会发生什么?

Haskell 为什么可以';我不能替换用GHC分发的库吗?如果我这样做会发生什么?,haskell,ghc,haskell-stack,Haskell,Ghc,Haskell Stack,我在中看到“一切都将可怕地崩溃”,堆栈不允许我替换base,但它允许我替换为testring。这有什么问题?有没有办法在不重新编译GHC的情况下安全地执行此操作?我正在调试基本库的一个问题,这将非常方便 注意:当我说我想替换base时,我的意思是使用同一GHC版本的base的修改版本。我正在调试库,而不是针对不同的GHC版本测试程序。大多数库都是包含Haskell代码的Haskell模块的集合。这些库的含义由模块中的代码决定 不过,base包有点不同。它提供的许多函数和数据类型没有在标准Hask

我在中看到“一切都将可怕地崩溃”,堆栈不允许我替换base,但它允许我替换为testring。这有什么问题?有没有办法在不重新编译GHC的情况下安全地执行此操作?我正在调试基本库的一个问题,这将非常方便


注意:当我说我想替换
base
时,我的意思是使用同一GHC版本的
base
的修改版本。我正在调试库,而不是针对不同的GHC版本测试程序。

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

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

例如,如果编译器没有将
seq
作为一个基本操作提供,那么事后就无法实现
seq
:除非使用
seq
(或根据
seq
定义的Haskell扩展之一)。同样,许多指针操作、
ST
操作、并发原语等也在编译器中实现

这些操作不仅通常是不可实现的,而且通常与编译器的内部数据结构紧密相关,从一个版本到下一个版本都会发生变化。因此,即使您设法说服GHC使用不同版本的
base
包在编译器中,最有可能的结果就是损坏内部数据结构,产生不可预测(并且可能是灾难性的)结果——竞争条件、内存破坏、空间泄漏、SEGFULTS等等


如果您需要多个版本的base,只需安装几个版本的GHC。它经过精心设计,可以在一台机器上和平共存多个版本。(特别是安装多个版本绝对不需要重新编译GHC,甚至不需要第一次编译GHC,这似乎是您最关心的问题。)

当然-只需使用不同的GHC版本,因为
bytestring
不是GHC的启动包。但是构建GHC需要
base
。这是错误的。
base
完全是用Haskell编写的-里面没有任何原语。它们在
GHC primit
中,它甚至没有使用
undefined
作为在。我知道,我正在调试标准库。问题是关于修改同一GHC版本中的
base
。编译器根本没有改变。