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
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.İkinci versiyonu
repeat x = let xs = x : xs in xs
let
"bağ", kendini ifade eden(:)
tek bir yapıcı oluşturma. kravat kullanır
Neden belirli Unicode karakterler içer...
't neden C# Statik Yöntemler bir ...
Neden't statik Java yöntemleri ge...
Neden süper.süper.() metodu, Java İzin...
Neden Java bize bir isim dosya adından...