我正在寫一個Haskell到Javascript代碼生成器,使用GHC作爲庫。由於Javascript沒有整數類型,它的Number類型只能正確表示整數2 3 3,我將整數表示爲Numbers,顯式地執行所有算術模2 2。這對於32位GHC非常有效,但對於64位版本則更糟糕。有什麼辦法可以告訴64位GHC將Int視爲Int32?
GHC會很高興地將Int64值強制轉換爲Ints並將Int常量解釋爲64位值(例如,0xffffffff變成4294967295而不是-1),這會導致各種煩人的問題。
即使在64位系統上,即使標準庫建立在32位機器上,「編譯器」也能很好地工作,但「請不要使用大數字,好嗎?」不是你想在編譯器手冊中看到的東西。一些問題(但不是全部)可以通過編譯-O0來緩解,但是(不出所料)產生的代碼不僅很慢,而且還太大。
因此,我需要阻止GHC假設Int和Int64是等價的。這甚至有可能嗎?
如果你想要32位整數,爲什麼不使用'GHC.Int.Int32'? –
這確實是可能的,但是「您必須使用Int32而不是Int,因爲Int被破壞」並不是您希望在編譯器手冊中看到的東西。 – valderman
「Int」有什麼承諾被破壞了? –