19
タイトルはかなり私の質問を要約します:Haskellのtypeclassesに関連する実行時のペナルティがあるか、実行時の結果がまったくないもの(ファントム型のようなもの)ですか?typeclassesに関連したランタイムのペナルティはありますか?
タイトルはかなり私の質問を要約します:Haskellのtypeclassesに関連する実行時のペナルティがあるか、実行時の結果がまったくないもの(ファントム型のようなもの)ですか?typeclassesに関連したランタイムのペナルティはありますか?
typeclassを必要とするのは、GHCでの嫌なことであるため、型クラスのメンバーを含む関数に余分な引数を渡すのと同じです。
GHCは、インライン化と型抜きを使用するコードを専門にしていますが、問題ではなく、非常に大きなパーセンテージの-O2が消えてしまうだけでなく、そのような最適化レベルがなくても議論はかなり安いです。
したがって、オーバーヘッドは、ファントム型またはnewtype以上のですが、あまり高くありません。
他のコンパイラのオーバーヘッドは異なる場合があります。例えばJHCは限定型の従属型を使用して型コンストラクタで事例分析を効果的に実行するため、JHCで作業する際の制約の数ではなく、制約型の変数の数を支払う必要があります。
余分な引数を渡すのは安いです。渡されたレコードで未知の関数を呼び出すのは非常に高価です。したがって、コンパイラがそれらを専門に扱わない限り、型クラスは非常に高価です。 – augustss
私はいつもAugustssの答えのスタイルに感謝します。過度の資格のある回答を提供し、多くの質問者が彼らの完全な価値を理解していないことを簡潔に示します(2011年以降)。私は時々、彼の答え/コメントに常にコメントするボットを作るべきだと感じています。「うわー、知っておいてよ! –
実際には、渡される辞書の関数を呼び出すために少なくとも1つ、通常2つの間接的なジャンプが必要であるという警告をパイプラインのストールなどに追加する必要があると思います。 –