SORU
19 Mayıs 2013, Pazar


Neden `izin` olun uzay effcient özyinelemeli?

Reaktif Fonksiyonel Programlama okurken bu ifade, Hai Liu tarafından "Plugging a Space Leak with an Arrow" ve Paul Hudak ( Sayfa 5) buldum :

Suppose we wish to define a function that repeats its argument indefinitely:

    repeat x = x : repeat x

or, in lambdas:

    repeat = λx → x : repeat x

This requires O(n) space. But we can achieve O(1) space by writing instead:

    repeat = λx → let xs = x : xs
                  in xs

Fark burada küçük görünüyor ama çok boşluk verimlilik ister. Neden ve nasıl olur ? Yaptığım en iyi tahmin elle onları değerlendirmek için

    r = \x -> x: r x
    r 3

    -> 3: r 3 
    -> 3: 3: 3: ........
    -> [3,3,3,......]

Yukarıdaki gibi, bu özyineleme için sonsuz yeni thunk oluşturmak için ihtiyacımız olacak. Daha sonra ikinci bir değerlendirmeye çalışıyorum:

    r = \x -> let xs = x:xs in xs
    r 3

    -> let xs = 3:xs in xs
    -> xs, according to the definition above: 
    -> 3:xs, where xs = 3:xs
    -> 3:xs:xs, where xs = 3:xs

İkinci şeklinde xs görünür ve her tek O(n) yerine 11 ** boşluk isteyebiliriz yüzden sanırım bu yüzden meydana gelen yerler arasında paylaşılabilir. Ama doğru olup olmayacağıma emin değilim.

BTW: anahtar kelime "aynı gazetenin sayfa geliyor 4: . paylaşılan

Sorun burada standart aramaya gerek değerlendirme kuralları. tanıyamadı işlevi vardır:

f = λdt → integralC (1   dt) (f dt) 

aynıdır:

f = λdt → let x = integralC (1   dt) x in x

Eski tanımı iş özyinelemeli çağrı tekrarlandı neden olur ikinci durumda hesaplama paylaşılan ise f için.

CEVAP
19 Mayıs 2013, Pazar


Kolay resimlerle anlamak için:

  • İlk sürümü

    repeat x = x : repeat x
    

    oluşturur bunları talep olarak daha kurucular ile kendisinin yerini alacak (:) kurucular bir thunk biten bir zincir. Bu nedenle, (n) alanı O.

    a chain

  • İkinci versiyonu

    repeat x = let xs = x : xs in xs
    

    let "bağ", kendini ifade eden (:) tek bir yapıcı oluşturma. kravat kullanır

    a loop

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bunliu

    bunliu

    2 Mayıs 2007
  • EatingIn

    EatingIn

    12 EKİM 2013
  • engineerguy

    engineerguy

    10 Ocak 2010