
On Monday 07 Feb 2005 9:28 am, Simon Peyton-Jones wrote:
Good point. Yes you can rely on it; but the binding is lazy. So for this
h :: Int -> (# String, String #) h = ...
f x = let (# p,q #) = h x in ...
you'll get
f x = let (p,q) = case h x of (# p,q #) -> (p,q) in ...
So the call to h only happens when either p or q is used.
On the other hand, if any of the binders in a let-pattern has an unlifted type (e.g. Int#) then the whole pattern match becomes strict. So if p or q had an unlifted type, the match would be strict.
I'll add a note to the usre manual.
Thanks. Sorry if I'm being a bit dim, but could you tell me if ghc will optimise out the boxed tuple construction in both these cases? I guess the answer must be yes in the second case because AFAIK you can't build an ordinary tuple containing an Int#. (But maybe I'm wrong.) Regards -- Adrian Hey