関数やデータ型などの型クラス制約をイントロスペクトすることは不可能です。しかし、ghciはそれを行うように見えます。どのように:ghciのtはそのすべての内密情報にアクセスしますか?
Prelude> :t show
show :: (Show a) => a -> String
だから、何とかそれはそれが印刷されているので、タイプクラスの制約を知っています。それはどうしていますか?
関数やデータ型などの型クラス制約をイントロスペクトすることは不可能です。しかし、ghciはそれを行うように見えます。どのように:ghciのtはそのすべての内密情報にアクセスしますか?
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"ファイルのみが必要です。