2016-04-27 34 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'。編譯器根本沒有改變。 –

相關問題