関数やデータ型などの型クラスの制約を内省することは不可能のようです。ただし、ghciはそれを行うようです。
Prelude> :t show
show :: (Show a) => a -> String
だから...どういうわけか、それを出力しているので、型クラスの制約を知っています。それはどのようにやっているのですか?
関数やデータ型などの型クラスの制約を内省することは不可能のようです。ただし、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」ファイルのみが必要です。