[Haskell-cafe] questions on lazy pattern, StateT monad

Wolfgang Jeltsch wolfgang at jeltsch.net
Thu Nov 24 15:03:34 EST 2005


Am Donnerstag, 24. November 2005 01:49 schrieb Fan Wu:
> Hi Wolfgang,
>
> Thanks for your response and examples! It helps a lot.
>
> From your example I can see "Lazy patterns are useful in contexts
> where infinite data structures are being defined recursively" (quote
> section 4.4 of Gentle Introduction to Haskell).

They are useful not only in conjunction with infinite data structures.  Take 
my example state transformer "everything" and modify it so that it calls next 
exactly two times, not infinitely many times, and outputs a pair of the 
outputs of the two next invocations.

Now let's assume you use this pair in a context where only its first component 
is used.  Without lazy patterns, next would be invoked two times although it 
need to be invoked only one time.  So you might have unnecessary evaluation.  
And you might have something even worse.  Let's assume that when we apply the 
function making up next on the output state of the first next invocation then 
we get _|_.  Without lazy patterns, just using the output of the first next 
invocation would result in your program aborting.  Of course, it shouldn't do 
so.

> But does it apply to the mplus case? I mean the mplus in (mplus m1 m2) and
> the mplus in (mplus m1' m2') are different due to the difference of Monads
> (one is StateT s m, the other is just m). If I change the mplus inside lift
> to something else like:  
>
>   mplus m1 m2       = do s <- peek
>                          let m1' = runState s m1
>                              m2' = runState s m2
>                          ~(a,s') <- lift (other_func m1' m2')
>                          poke s'
>                          return a
>
>
> Is it still required that (a,s') be lazy?

I thought a bit about the lazy pattern in the mplus implementation and still 
don't know if it's necessary. :-(

> I just want to see how things works in an less obvious example like this
> one.
>
> Thanks,
> Fan

Best wishes,
Wolfgang


More information about the Haskell-Cafe mailing list