2011-03-29 62 views
6

似乎不可能對函數和數據類型等的類型約束進行內省。但是,ghci似乎這樣做。如何在ghci中訪問所有這些內省信息?

Prelude> :t show 
show :: (Show a) => a -> String 

因此......它知道類型類的約束,因爲它打印出來。這是怎麼回事?

回答

10

信息保存在接口文件(module.hi)中。要從正在運行的程序中獲取它,您需要查找並閱讀.hi文件(我相信Hackage上的Hint包執行此操作);由於ghci在編譯爲字節碼的過程中讀取.hi文件,因此它具有方便可用的信息。

你可以看到.hi文件中有什麼與ghc --show-iface module.hi

3

單獨編譯的「二進制文件」是「.hi」文件。它們包含所有類型信息,以便您可以編寫使用它們的代碼,並且它們包含所有類型類定義和所有類型類實例,以便您的代碼可以使用或擴展它們。

因此,ghci將源代碼編譯爲「.hi」並加載所有相關的「.hi」文件。這給了它所有類型的完美知識。 ghci不需要做的是回到所有導入模塊的源頭,它只需要「.hi」文件。

相關問題