
Am Samstag, 6. Januar 2007 05:12 schrieb Brian Hurt:
Even better, if I define:
nth 0 (x:_) = Just x nth i (_:xs) = if i < 0 then Nothing else nth (i-1) xs nth i [] = Nothing
makelist i = i `seq` i : (makelist (i+1))
nth 10000000 (makelist 1)
Hi Brian. i just like to mention another tricky solution: you can apply seq in such a way to the list, so that each element will be evaluated before advancing deeper into the list. ghci -fglasgow-exts -fbang-patterns Prelude> :t foldr foldr :: forall a b. (a -> b -> b) -> b -> [a] -> b Prelude> let strict = foldr (\x xs ->x `seq` (x:xs)) [] Prelude> let strict = foldr (\(!x) xs -> (x:xs)) [] -- using bang patterns instead, this is easier to read Prelude> let strict = foldr ((:) $!) [] -- or complete pointfree Prelude> let lazy = foldr ((:) $) [] Prelude> :t strict strict :: forall a. [a] -> [a] Prelude> lazy [1..] !! 1000000 *** Exception: stack overflow Prelude> strict [1..] !! 1000000 1000001 - marc