seq vs. pseq

Malcolm Wallace Malcolm.Wallace at cs.york.ac.uk
Fri Oct 27 11:27:48 EDT 2006


Simon Marlow <simonmarhaskell at gmail.com> wrote:

> The difference is subtle.  The semantics of seq and pseq are
> identical; however,  GHC can see that seq is strict in both its
> arguments and hence could choose to  evaluate them in either order,
> whereas pseq is only strict in its first argument  as far as the
> strictness analyser is concerned.  The point is that pseq is  useful
> for controlling evaluation order, which is what you want for adding 
> parallelism to a program.  seq, on the other hand, is not useful for
> controlling  evaluation order.

This is a rather weird thing, and I would consider it a bug in the
Haskell Report, rather than a bug in ghc.  (It bites hard when you are
trying to implement something like HPC.)

The very name 'seq' surely suggests that you are controlling the
evaluation order.  "Please evaluate this thing on the left first".  But
that is _not_ what the Haskell Report says!  Ghc takes the Report
literally, and so the thing on the right is just as likely to be
evaluated before the thing on the left!

Surely the language designers did not intend this consequence.  For
Haskell-prime, can we fix this bug, and ensure that 'seq' really implies
ordering of evaluation?

[ If you just want strictness annotations, with the compiler free to
  reorder computations, I would say ($!) is a better bet, and could be
  redefined to use not the natural `seq`, but the strict-in-both-arguments
  variation. ]

Regards,
    Malcolm


More information about the Haskell-prime mailing list