5 entry daha
  • 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).
1 entry daha
hesabın var mı? giriş yap