2016-04-27 50 views
2

我在this answerthis one看到“一切都会崩溃”,Stack不会让我替换base,但它会让我替换bytestring。这有什么问题?有没有办法在不重新编译GHC的情况下安全地做到这一点?我正在调试基本库的问题,它会很方便。为什么我无法替换使用GHC分发的库?如果我这样做会发生什么?

N.B.当我说我想替换base我的意思是与相同的GHC版本的base的修改版本。我正在调试这个库,而不是针对不同的GHC版本测试一个程序。

+1

当然 - 只使用不同的GHC版本 – Carsten

+0

因为'bytestring'不是引导软件包GHC。但是GHC需要'base'来构建。 – Sibi

回答

5

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

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

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

这些操作不仅通常不可实现,而且通常与编译器的内部数据结构紧密相关,这些内部数据结构从一个发行版到另一个发行版发生了变化。因此,即使您设法说服GHC使用来自不同(版本)编译器的base软件包,最可能的结果也只会是内部数据结构受到破坏,导致不可预知的(并且可能是灾难性的)结果 - 竞争条件,垃圾内存,空间泄漏,段错误,那种事情。

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

+1

这大多是错误的。 'base'完全是用Haskell编写的 - 它没有任何原语。它们在'ghc-prim'中,它甚至不使用'undefined'。我会知道,*我正在调试标准库*。问题是关于修改来自同一个GHC版本的'base'。编译器根本没有改变。 –

相关问题