[Haskell] factoring `if'
Jeremy Gibbons
Jeremy.Gibbons at comlab.ox.ac.uk
Mon Oct 11 06:39:53 EDT 2004
On Mon, 11 Oct 2004, Serge D. Mechveliani wrote:
> How do you think, is the program (1) equivalent to (2)
> in the meaning of Haskell-98 ?
Not at all. If foo is non-strict and p partial, (2) may yield a result
where (1) would not. You identify the possibility yourself: (2) is lazier.
> (1) (\ x -> (if p x then foo (g x) else foo (h x))
> where
> p ... g ... h ... foo ...
> )
>
> (2) (\ x -> foo ((if p x then g x else h x)
> where
> p ... g ... h ... foo ...
> )
> )
>
> If it is equivalent, then does it make sense for a compiler to
> convert (1) to (2): to separate a common `factor' of the if-branches
> ?
> The reason for this may be, for example, that the result printing
> of (f x) is more `lazy' in (2) than in (1):
> the part of foo may print immediately and (g x) or (h x) may print
> long after.
> This is a difference in behavior, it does not effect the computation
> meaning.
>
> I have a large program which is easily written in the style of (1),
> (and in many places it sets `case' instead of `if').
> Annoyingly, it prints out in a not a lazy manner.
> It can be rewritten in the form of (2), but with effort, and it will
> look less plain.
> So, maybe, this is a business of a compiler?
Jeremy.Gibbons at comlab.ox.ac.uk
Oxford University Computing Laboratory, TEL: +44 1865 283508
Wolfson Building, Parks Road, FAX: +44 1865 273839
Oxford OX1 3QD, UK.
URL: http://www.comlab.ox.ac.uk/oucl/people/jeremy.gibbons.html
More information about the Haskell
mailing list