我在this answer和this one看到「一切都會崩潰」,Stack不會讓我替換base,但它會讓我替換bytestring。這有什麼問題?有沒有辦法在不重新編譯GHC的情況下安全地做到這一點?我正在調試基本庫的問題,它會很方便。爲什麼我無法替換使用GHC分發的庫?如果我這樣做會發生什麼?
N.B.當我說我想替換base
我的意思是與相同的GHC版本的base
的修改版本。我正在調試這個庫,而不是針對不同的GHC版本測試一個程序。
我在this answer和this one看到「一切都會崩潰」,Stack不會讓我替換base,但它會讓我替換bytestring。這有什麼問題?有沒有辦法在不重新編譯GHC的情況下安全地做到這一點?我正在調試基本庫的問題,它會很方便。爲什麼我無法替換使用GHC分發的庫?如果我這樣做會發生什麼?
N.B.當我說我想替換base
我的意思是與相同的GHC版本的base
的修改版本。我正在調試這個庫,而不是針對不同的GHC版本測試一個程序。
大多數庫是包含Haskell代碼的Haskell模塊的集合。這些庫的含義取決於模塊中的代碼。
雖然base
包有些不同。它提供的許多函數和數據類型是在標準Haskell中實現的而不是;它們的含義不是由包中包含的代碼給出的,而是由編譯器本身給出的。如果您查看base
軟件包(以及其他引導庫)的來源,您將看到許多操作,其完整定義僅爲undefined
。編譯器運行時系統中的特殊代碼實現了這些操作並將其公開。
例如,如果編譯器沒有提供seq
作爲原始操作,那麼事後就沒有辦法實現seq
:沒有Haskell術語可以記下來,它們的類型和語義與seq
,除非它使用seq
(或根據seq
定義的一個Haskell擴展)。同樣,許多指針操作,ST
操作,併發原語等都是在編譯器本身中實現的。
這些操作不僅通常不可實現,而且通常與編譯器的內部數據結構緊密相關,這些內部數據結構從一個發行版到另一個發行版發生了變化。因此,即使您設法說服GHC使用來自不同(版本)編譯器的base
軟件包,最可能的結果也只會是內部數據結構受到破壞,導致不可預知的(並且可能是災難性的)結果 - 競爭條件,垃圾內存,空間泄漏,段錯誤,那種事情。
如果您需要幾個版本的基礎,只需安裝幾個版本的GHC。它經過精心設計,使多個版本可以在一臺機器上和平共處。 (特別是安裝多個版本絕對不需要重新編譯GHC,甚至不需要第一次編譯GHC,這似乎是您的主要擔憂。)
這大多是錯誤的。 'base'完全是用Haskell編寫的 - 它沒有任何原語。它們在'ghc-prim'中,它甚至不使用'undefined'。我會知道,*我正在調試標準庫*。問題是關於修改來自同一個GHC版本的'base'。編譯器根本沒有改變。 –
當然 - 只使用不同的GHC版本 – Carsten
因爲'bytestring'不是引導軟件包GHC。但是GHC需要'base'來構建。 – Sibi