似乎不可能對函數和數據類型等的類型約束進行內省。但是,ghci似乎這樣做。如何在ghci中訪問所有這些內省信息?
Prelude> :t show
show :: (Show a) => a -> String
因此......它知道類型類的約束,因爲它打印出來。這是怎麼回事?
似乎不可能對函數和數據類型等的類型約束進行內省。但是,ghci似乎這樣做。如何在ghci中訪問所有這些內省信息?
Prelude> :t show
show :: (Show a) => a -> String
因此......它知道類型類的約束,因爲它打印出來。這是怎麼回事?
信息保存在接口文件(module.hi
)中。要從正在運行的程序中獲取它,您需要查找並閱讀.hi
文件(我相信Hackage上的Hint包執行此操作);由於ghci
在編譯爲字節碼的過程中讀取.hi
文件,因此它具有方便可用的信息。
你可以看到.hi
文件中有什麼與ghc --show-iface module.hi
。
單獨編譯的「二進制文件」是「.hi」文件。它們包含所有類型信息,以便您可以編寫使用它們的代碼,並且它們包含所有類型類定義和所有類型類實例,以便您的代碼可以使用或擴展它們。
因此,ghci將源代碼編譯爲「.hi」並加載所有相關的「.hi」文件。這給了它所有類型的完美知識。 ghci不需要做的是回到所有導入模塊的源頭,它只需要「.hi」文件。