Par and seq
seq have much in common.
They have the same signature and thus the same use patterns.
par let you start a computation in parallel
seq forces a computation to actually take place (avoiding lazy evaluation).
par :: a -> b -> b seq :: a -> b -> b
You could also define a function
par2 which computes the arguments of a two-argument function
f in parallel before feeding them to
par2 :: (a -> b -> c) -> (a -> b -> c) par2 f x y = x `par` y `par` f x y
par2 is also universal, because you can define
par in terms of
par = par2 (\ _x y -> y)
You can see, that
par is the more basic combinator, because it scales to any number of arguments.
- Haskell-Cafe: 'par' - why has it the type a -> b -> b ?