
Serge LE HUITOUZE wrote:
I tend to believe that the '@' notation is mere syntactic sugar. Indeed, it seems to me that Haskell compilers need not to be very clever to share the identical sub-expressions, for one very simple reason implied by Haskell semantics: referential transparency.
Am I right, or am I missing something?
You are missing that modifying a program in a way which adds sharing can have disastrous performance effects. In particular, adding sharing can stop something being GCed, which can convert an algorithm which runs in linear time and constant space to one which runs in linear space (and therefore, perhaps, quadratic time). Therefore compilers have to be conservative about adding sharing. In general, sharing in GHC-compiled programs is specified rather explicitly: sharing is naming, so things which are names (let-bound or pattern-bound) are guaranteed shared and normally nothing else. You can *imagine* a compiler being cleverer about this. It turns out to be an interesting but hard problem. Jules