Phil, thanks for the response.
> I was thinking about the dynamic behavior of par, and there's something
> that's a little confusing to me. Am I right in understanding that (x
> `par` y) evaluates to y, and may or may not evaluate x along the way?
The reason that par doesn't necessarily evaluate it's 1st argument is that
typical parallel Haskell programs contain vast amounts of potential
parallelism. So rather than create a relatively heavyweight thread and be
forced to administer it, e.g. schedule it for every possible expression
that could be evaluated in parallel, the expression is 'sparked',
i.e. a
lightweight action that simply notes that the expression *could* be
evaluated in parallel.