Haskellではより効率的です。パターンマッチングまたはネストされたif / caseステートメント?
-
06-07-2019 - |
質問
Haskellでのパターンマッチングの効率性に興味があります。ネストされた if
/ case
ステートメントとその逆よりもパターンマッチングが優れている単純なケースは何ですか?
ご協力ありがとうございます。
解決
Haskellでは、 case
とパターンマッチングは密接にリンクされています。あなたは他なしで一方を持つことはできません。 if p then e1 else e2
は、 case p {True-> e1; False-> e2}
。これらの理由から、あなたが求めている例を作成することは不可能だと思います。 Core Haskellでは、すべてが case
と同等です。
MLファミリーの言語では、オプティマイザーは多くの場合、複雑なパターンマッチで非常に印象的なことを実行できます。 Haskellコンパイラーにとってこれはより困難です。遅延評価のため、パターンマッチコンパイラは特定のテストの順序を変更できません。つまり、 case
ステートメントをさまざまな方法でネストすると、パフォーマンスが異なる可能性がありますが、Haskellでは異なるセマンティクスも取得します。そのため、一般的にコンパイラは混乱しません。
独自のコードを記述する方法に関しては、ケース式が最も少ないコードが最適であると想定するのは安全です(1つの if
は1つのケース式と同等であることに注意してください) 。
他のヒント
これは確認しませんでしたが、コンパイラーによってHaskellのコアに変換されると、両方の形式がネストされた大文字と小文字の式になると思います。見つけるための最良の方法は、コンパイラ自体に尋ねることです。 GHCでは、引数を使用してコア中間プログラムのダンプをオンにできます。
- 簡素化する前:-ddump-ds
- 簡略化後:-ddump-simpl
仕様によれば、これらは 意味的に同等の。もちろん、これは必ずしもそれらが同じように実装されることを意味するわけではありませんが、まともなコンパイラに違いがあった場合、私は個人的に驚くでしょう。