Haskell で型クラスのインスタンスを定義するには、型クラスが必要とする関数の辞書を提供する必要があります。つまり、 のインスタンスを定義するにはBounded
、 と の定義を提供する必要がありminBound
ますmaxBound
。
この質問の目的のために、このディクショナリvtbl
を型クラス インスタンスの と呼びましょう。これが貧弱な類推であるかどうか教えてください。
私の質問は、型クラス関数を呼び出すときに、GHC からどのようなコード生成を期待できるかについてです。そのような場合、3 つの可能性が考えられます。
- 実行時に実装関数がダウンしていることを確認するための vtbl ルックアップ
- vtbl ルックアップはコンパイル時に行われ、実装関数への直接呼び出しが生成されたコードで発行されます。
- vtbl ルックアップはコンパイル時に行われ、実装関数は呼び出しサイトでインライン化されます。
これらのそれぞれがいつ発生するか、または他の可能性があるかどうかを理解したいと思います。
また、型クラスが「メイン」コンパイル ユニットの一部ではなく、個別にコンパイルされたモジュールで定義されているかどうかは重要ですか?
実行可能なプログラムでは、Haskell はプログラム内のすべての関数と式の型を認識しているようです。したがって、型クラス関数を呼び出すとき、コンパイラは vtbl が何であるか、および呼び出すべき実装関数を正確に認識している必要があります。コンパイラが少なくとも実装関数への直接呼び出しを生成することを期待しています。これは本当ですか?
(ここでは、実行しないモジュールをコンパイルすることと区別するために、「実行可能なプログラム」と呼んでいます。)