> > On Tue, 2008-01-22 at 11:55 -0500, Michael Speer wrote:
> > > rexn ns pps = let ( ~( xs , rps ) ,
> > > ~( ~( nxs ) ,
> > > ~( rxs , rrps ) ) ) = ( exn nxs pps ,
> Not one of the lazy marks was required in the current version.
Pattern bindings via let are always irrefutable; the ~s here are all redundant.
This took me a little while to figure out; I was browsing
Control.Monad.State.Lazy and trying to figure out how it was different
than Control.Monad.State.Strict; they look almost exactly the same.
But then I noticed code that looked like the following:
(strict)
m >>= f = State $ \s ->
case runState m s of (a, s') -> runState (f a) s'
(lazy)
m >>= f = State $ \s ->
let (a, s') = runState m s in runState (f a) s'
The strict code deconstructs the pair in a case expression, so
"runState m s" will always get evaluated at least enough to know that
it is going to return a pair and not _|_.
The lazy code immediately calls (f a) and m may not get evaluated at
all if f is lazy and doesn't access the state.
-- ryan
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe