32

en Haskell aşağıdaki biz var diyelim:Haskell GHC: Bir modelin N yapıcılarla zaman uyuşmazlığı nedir?

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

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

Ne algoritması burada desen maç gerçekleştirmek için kullanılır?

(1) Doğrusal arama, bu özel görevi mantıklı olurdu

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

(2) İkili arama gibi bir şey,: İki seçenek görmek sette {TO yılında t.tag ararken ... T1023}. Bununla birlikte, örüntü eşleştirmenin genel olarak birçok başka yetenekleri ve genellemeleri olduğu yerlerde, bu kullanılamaz.

GHC ile derleme, hangi algoritma kullanılır ve ttoInt içinde desen eşleştirme için N açısından zaman karmaşıklığı nedir?

+1

Bu soru bana şunu hatırlattı: [GHC'nin otomatik türevli Eq'si gerçekten * O (N) *?] (Http://stackoverflow.com/questions/6212387) – hvr

cevap

30

Desen eşleşmesini sabit bir zaman işlemi yapan bir atlama tablosu kullanılır. this page atlama tablolar gibi switch ifadeleri Cmm düzeyinde uygulanmasını söz eden ve this old tagging design document bir üreten bir örnek olarak bir Bool üzerinde case kullanır rağmen

Ne yazık ki, bunun için bir yukarı güncel alıntısını saptayamadık masa atla.

+9

Bu, zaman karmaşıklığının ** olduğu anlamına gelir. Açık olmadığında O (1) ** ve ayrıca ** 1 (1) **. – dflemstr

+1

Hey, Adil değil! Ben O (1) 'in fiili' Θ (0) 'i seçmesini istedim. –

+7

[GHC kaynağını] belirtebilirsiniz (https://github.com/ghc/ghc/blob/master/compiler/codeGen/CgUtils.hs#L647). –

İlgili konular