The source code for Control.Parallel.Strategies ( http://hackage.haskell.org/packages/archive/parallel/3.1.0.1/doc/html/src/Control-Parallel-Strategies.html#Eval ) contains a type Eval defined as:
data Eval a = Done a
which has the following Monad instance:
instance Monad Eval where
return x = Done x
Done x >>= k = k x -- Note: pattern 'Done x' makes '>>=' strict
Note the comment in the definition of bind. Why is this comment true? My understanding of strictness is that a function is only strict if it must "know something" about its argument. Here, bind just applies k to x, thus it doesn't appear (to me) to need to know anything about x. Further, the comment suggests that strictness is "induced" in the pattern match, before the function is even defined. Can someone help me understand why bind is strict?
Also, it looks like Eval is just the identity Monad and that, given the comment in the definition of bind, bind would be strict for almost any Monad. Is this the case?
Identity
is a newtype wrapper, which means that pattern matches always succeed (newtype
s don't create an additional layer of lifting and thusId ⊥ ≡ ⊥
). You could makeEval
non-strict by writing bind asm >>= k = let Done x = m in k x
or~(Done x) >>= k = k x
. – Trovillion