Like
seq but ensures that the first argument is evaluated
before returning.
a `pseq` b evaluates
a to weak head normal
form (WHNF) before returning
b.
This is similar to
seq, but with a subtle difference:
seq is strict in both its arguments, so the compiler may, for
example, rearrange
a `seq` b into
b `seq` a
`seq` b. This is normally no problem when using
seq
to express strictness, but it can be a problem when annotating code
for parallelism, because we need more control over the order of
evaluation; we may want to evaluate
a before
b,
because we know that
b has already been sparked in parallel
with
par.
This is why we have
pseq. In contrast to
seq,
pseq is only strict in its first argument (as far as the
compiler is concerned), which restricts the transformations that the
compiler can do, and ensures that the user can retain control of the
evaluation order.