Lazy Evaluation

Jay Cox sqrtofone@yahoo.com
Mon, 4 Mar 2002 20:35:01 -0600 (CST)


On Mon, 4 Mar 2002, Tom Pledger wrote:

> Nguyen Phan Dung writes:
>  :
>  | mylist :: [Integer]
>  | mylist = [1..1000000000]
>  |
>  | In Hugs, I type mylist to print out all the elements inside. However,
>  | after printing about 22000 elements, the system crashs & outputs:
>  | "Garbage collection fails to reclaim sufficient memory"
>
> The declaration of mylist is a pattern binding, not a function binding
> - see section 4.4.3 of the Haskell 98 report.
>
> What that means in this particular case is that the system saves the
> result in case you want to use it again, rather than freeing the part
> of the list it's already printed.
>
> Try typing [1..1000000000] at the Hugs prompt instead.


So would wrapping such possibly fiendish entities as [1..] with the
"const" function and replacing all references to the toplevel binding with
"(binding ())"  make sure that the first part of the list could be thrown
away and re-computed if needed?

Or does one need to NOINLINE it as well?



Example to make myself clear:

mylist = const [1..1000000000]

main = print (mylist ())


It seems like we had a discussion about something very similar to this a
few months ago on some haskell.org list.


Thanks,

Jay Cox