32

のは、Haskellの以下の我々が持っているとしましょう:Haskell GHC:N個のコンストラクタによるパターン一致の時間複雑度はどのくらいですか?

data T = T0 | T1 | T2 | ... | TN 

toInt :: T -> Int 
toInt t = case t of 
    T0 -> 0 
    T1 -> 1 
    T2 -> 2 
    ... 
    TN -> N 

何アルゴリズムは、ここでは、パターンマッチングを実行するために使用されていますか?

(1)リニア・サーチ、この特定のタスクで賢明だろう

if  (t.tag == T0) { ... } 
else if (t.tag == T1) { ... } 
else ... 

(2)バイナリサーチのようなもの、::私は2つのオプションが表示さ集合{TOt.tag探しを... T1023}。しかし、パターンマッチングには他の多くの機能や一般化がありますが、これは使用できません。

のパターンマッチングのために、GHCでコンパイルするアルゴリズムと使用するアルゴリズムはどれくらいありますかtoInt

+1

この質問は、[GHCの自動派生 'Eq'インスタンスは本当に* O(N)*ですか?](http://stackoverflow.com/questions/6212387) – hvr

答えて

30

ジャンプテーブルが使用され、パターン一致が一定の時間動作になります。 this pageは、ジャンプテーブルとしてswitch文のCmmレベルの実装に言及し、this old tagging design documentは生産、一例としてBoolcaseを使用しているが

は、残念ながら、私は、このための最新の引用を見つけることができませんよジャンプテーブル。

+9

これは私に思い出させました。 O(1)**、また**Θ(1)**である。 – dflemstr

+1

ねえ、いいえ!私は 'O(1)'が実際の 'Θ(0)'を包含することを望んでいました。 –

+7

[GHCソース](https://github.com/ghc/ghc/blob/master/compiler/codeGen/CgUtils.hs#L647)を引用できます。 –

関連する問題