2012-06-08 35 views
5

şu var Sağlar ki:Haskell: Liste füzyonu, nerede ihtiyaç duyulur?

l = map f (map g [1..100]) 

Ve yapmak istediğimiz:

head l 

Yani elde ederiz:

head (map f (map g [1..100])) 

Şimdi, ilk elemanını almak zorunda bu. map yüzden böyle bir şey tanımlanır:

f (head (map g [1..100])) 

Ve sonra tekrar uygulanmıştır:

map f l = f (head l) : (map f (tail l)) 

Öyleyse olsun

f (g 1) 

yok ara sonuçlanır

f (g (head [1..100])) 

li sts sadece tembellik nedeniyle oluşur.

Bu analiz doğru mu? Ve böyle basit yapılarla:

foldl' ... $ map f1 $ map f2 $ createlist 

hatta "liste füzyonu" olmadan, şimdiye kadar yaratılan ara listeleri nelerdir? (Bence tembellik onları önemsiz olarak ortadan kaldırmalı). Yaptığımız eğer bir listesini tutmak için bir sebep görebilirsiniz


tek yerdir: Biz başka bir yerde kullanılması halinde, l' tutmak isteyebilirsiniz

l' = [1..100] 
l = map f (map g l') 

. Bununla birlikte, yukarıdaki l' numaralı davada, derleyicinin, yukarıdaki listeyi depolamaktan ziyade yukarıdaki listeyi yeniden hesaplamak için daha hızlı gerçekleştirmesi oldukça önemsiz olmalıdır.

cevap

6

map örneğinizde, liste hücreleri oluşturulur ve sonra hemen çöp toplanır. Liste füzyonu ile GC veya thunk manipülasyon (her ikisi de ücretsiz değildir) gereklidir. Orta veri yapıları pahalı olduğunda, Füzyon faydaları en çok

6

. Geçirilen yapı tembeldir ve sıralı bir şekilde erişildiğinde, yapılar nispeten ucuz olabilir (listelerde olduğu gibi).

  • Tembel yapılar için, füzyon bir thunk oluşturma sabit faktörünü kaldırır ve derhal çöp toplar.
  • Sıkı yapılar için füzyon, O (n) numaralı işi silebilir.

Bu nedenle en büyük faydalar sıkı diziler ve benzer yapılar içindir. Bununla birlikte, tembel listelerin bir araya getirilmesi bile, daha az ara yapıların thunks olarak tahsis edilmesinden ötürü, artan veri lokasyonu nedeniyle hala bir kazançtır.