Lazy/Strict Monads (was: Non-monolithic version of 'sequence' for IO monad?)

Koen Claessen
Wed, 7 Nov 2001 17:34:16 +0100 (MET)

Josef Svenningsson wrote:

 | bind1 m f = \s -> let (s',a) = m s
 | 		  in f a s'
 | bind2 m f = \s -> case m s of
 | 		   (s',a) -> f a s'

There are two more binds I would like to add to this list:

  bind3 m f = \s -> s `seq` bind1 m f s
  bind4 m f = \s -> s `seq` bind2 m f s

In other words, here we make sure that we have evaluated the
initial state completely before we continue. Could you
eleborate on these a little bit more?