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 simple expression:

    (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

    Replace
        f $! x = x `seq` f x
    with
        f $! x = f `seq` x `seq` f x
    in section 6.2

Regards,
    Malcolm

_______________________________________________
Haskell-prime mailing list
Haskell-prime@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-prime

Reply via email to