Understanding strictness of ghc output
O.Chitil at kent.ac.uk
Tue Jun 22 10:49:12 EDT 2004
Duncan Coutts wrote:
>On Tue, 2004-06-22 at 14:17, Tomasz Zielonka wrote:
>>On Tue, Jun 22, 2004 at 01:52:44PM +0100, Malcolm Wallace wrote:
>>>Same again. Try
>>> addHeight h E = h `seq` h
>>>which, although it looks bizarre, actually forces the evaluation of h,
>>>whilst simply returning it does not.
>>That contradicts my intution for seq. I would read it as "h is forced
>>before h is forced", and I would think that (h `seq` h) is equivalent
>I think a better intuition is that "h is forced before h is *returned*".
>You can return a value without that value being forced to head normal
>form. In fact this is the ordinary case. Values are only 'forced' when
>you pattern match on them (or if you use seq), and even then only when
>the result of the pattern match is used.
However, standard lazy evaluation will only evaluate a function
application if the head normal form of the result is needed.
So when addHeight is computed its result is needed. Hence there is no
point in writing "h `seq` h" instead of just "h".
This could only make a difference for some form of optimistic evaluator
that stops in the middle of evaluation on turns the remaining evaluation
into a closure. But would such an evaluator give the programmer control
about where exactly it would stop optimistic evaluation?
Computing Laboratory, University of Kent, Canterbury, Kent CT2 7NF, UK.
Tel: +44 (0)1227 824320; Fax: +44 (0)1227 762811
More information about the Glasgow-haskell-users