
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 to h.
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? Olaf -- OLAF CHITIL, Computing Laboratory, University of Kent, Canterbury, Kent CT2 7NF, UK. URL: http://www.cs.kent.ac.uk/people/staff/oc/ Tel: +44 (0)1227 824320; Fax: +44 (0)1227 762811