As noted, IO is not strict in the value x, only in the operation that generates x. However, should you desire strictness in a generic way, it would be trivial to model a transformer monad to provide it. E.g. data StrictT m a = StrictT (m a) runStrictT :: StrictT m a -> m a runStrictT (StrictT op) = op class (Monad m) => Monad (StrictT m a) where return x = StrictT (return x) (StrictT op) >>= f = op >>= \ a -> a `seq` StrictT (f a) On Sat, Jan 21, 2012 at 9:29 AM, Victor S. Miller <victorsmiller@gmail.com>wrote:
The "do" notation translates
do {x <- a;f} into
a>>=(\x -> f)
However when we're working in the IO monad the semantics we want requires that the lambda expression be strict in its argument. So is this a special case for IO? If I wanted this behavior in other monads is there a way to specify that?
Victor
Sent from my iPhone _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe