lazy evaluation
-
haskell'da da kullaniminda dikkatli olunmasi gereken hede.
mesela su ifadeyi ele alalim: foldl (+) 0 [1..1000000]
foldl her ne kadar tail recursion ile tanimlanmis bir fonksiyon olsa bile, haskell'deki lazy evaluation stratejisi yuzunden sonraki onyinelemeli fonksiyon cagrisina arguman olarak verilen degerlerin hesaplanmasi en sonra birakiliyor. (en sondan kasit base case.) yani once bir milyon sayinin birbirine eklenme expression'i olusturuluyor, bu expression sonradan hesaplaniyor:
(((((((((0 + 1) + 2) + 3) + 4) + 5) + ...) + 999997) + 999998) + 999999) + 1000000
boyle bir islem de buyuk bir olasilikla stack overflow'a sebebiyet veriyor. halbuki once islemi olusturup sonra degerini hesaplamak yerine foldl esnasinda toplam degerin adim adim hesaplanmasini zorunlu kilsaydik boyle bir sorunla karsilasmayacaktik. haskell'de bunun cozumu surada.
ayrica (bkz: space complexity).
ekşi sözlük kullanıcılarıyla mesajlaşmak ve yazdıkları entry'leri
takip etmek için giriş yapmalısın.
hesabın var mı? giriş yap