Marc A. Ziegert coeus at gmx.de
Sat Jan 6 02:42:33 EST 2007

```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
```