[Haskell] bug in language definition (strictness)
Malcolm.Wallace at cs.york.ac.uk
Thu Aug 6 06:08:12 EDT 2009
It has been brought to my attention (as errata editor of the revised
H'98 report) that there is a bug in the language definition,
concerning strictness annotations on datatypes.
In section 4.2.1, the translation of strict components of a data
constructor is defined as
> (\ x1 ... xn -> ( ((K op1 x1) op2 x2) ... ) opn xn)
> where opi is the non-strict apply function $ if si is of the form
> ti, and opi is the strict apply function $! (see Section 6.2) if si
> is of the form ! ti. Pattern matching on K is not affected by
> strictness flags.
yet, because of the definition of $!, this applies the constructor to
its arguments right-to-left instead of the intuitive left-to-right.
All extant compilers in fact evaluate the strict fields left-to-right
in violation of the Report.
The same non-intuitive behaviour can be seen more clearly in the
(f $! x) $! y
in which you might expect x to be evaluated before y, but in fact it
is the other way round. (And here, the compilers do follow the Report.)
The fix I propose for H'98 (and equally for Haskell Prime) is to
change the definition of $! as follows
f $! x = x `seq` f x
f $! x = f `seq` x `seq` f x
in section 6.2
More information about the Haskell