11

Haskellでのパターンマッチングの効率に興味があります。パターンマッチングがネストされたif/caseステートメントよりも優れているという単純なケースは何ですか?

ご協力いただきありがとうございます。

4

3 に答える 3

20

Haskellではcase、パターンマッチングは密接に関連しています。あなたはもう一方なしで一方を持つことはできません。 if p then e1 else e2のシンタックスシュガーですcase p of { True -> e1; False -> e2 }。これらの理由から、あなたが求める例を作成することは不可能だと思います。Core Haskellでは、すべてがと同等caseです。

MLファミリーの言語では、オプティマイザーは複雑なパターンの一致で非常に印象的なことを実行できることがよくあります。これはHaskellコンパイラにとってより困難です。遅延評価のため、パターンマッチコンパイラは特定のテストを並べ替えることができません。言い換えれば、caseステートメントをさまざまな方法でネストすると、パフォーマンスが異なる可能性がありますが、Haskellではセマンティクスも異なります。したがって、一般的にコンパイラはそれを台無しにしません。

独自のコードを作成する方法に関しては、大文字と小文字を区別する式が最も少ないコードが最適であると考えるのが安全です(1つifは1つの大文字と小文字の表現に相当することに注意してください)。

于 2009-01-09T05:31:26.853 に答える
7

私はこれを確認しませんでしたが、コンパイラーによってコアHaskellに変換されると、両方の形式がネストされたケースオブ式になると思います。調べるための最良の方法は、コンパイラ自体に尋ねることです。GHCでは、引数を使用してコア中間プログラムのダンプをオンにできます。

  • 簡略化する前:-ddump-ds
  • 簡略化後:-ddump-simpl
于 2009-01-09T03:48:52.410 に答える