
On Tue, Oct 12, 2010 at 4:34 AM, Bertram Felgenhauer
Simon Marlow wrote:
Interesting. You're absolutely right, GHC doesn't respect the report, on something as basic as sections! The translation we use is
(e op) ==> (op) e
once upon a time, when the translation in the report was originally written (before seq was added) this would have been exactly identical to \x -> e op x, so the definition in the report was probably used for consistency with left sections.
We could make GHC respect the report, but we'd have to use
(e op) ==> let z = e in \x -> z op x
to retain sharing without relying on full laziness.
We should keep in mind that this was changed deliberately in ghc 6.6, in order to support "postfix" operators.
http://www.haskell.org/ghc/docs/6.6/html/users_guide/release-6-6.html
The motivating example was the factorial operator which can currently be written as (n !) in ghc-Haskell.
From http://www.haskell.org/ghc/docs/6.6/html/users_guide/syntax-extns.html#postf... "Since this extension goes beyond Haskell 98, it should really be enabled by a flag; but in fact it is enabled all the time. (No Haskell 98 programs change their behaviour, of course.) "
Which is not true, but is probably true enough. Of course, there is now a flag http://www.haskell.org/ghc/docs/6.12.2/html/users_guide/syntax-extns.html#po... but it seems that the non-standard interpretation of (e !) is still kept even without it. Without the flag, it type checks as if you had written \x -> e ! x but it still behaves as if you had written (!) e.