[Haskell-cafe] Space efficiency problem

Ben Rudiak-Gould Benjamin.Rudiak-Gould at cl.cam.ac.uk
Fri Nov 12 03:56:38 EST 2004


Adrian Victor CRISCIU wrote:

>  Thanks for the advice. However, though I don't know how ghc manages
>  the heap, I am not sure it is possible to achieve constant heap
>  usage, because a value of type State is a function, and >>= is
>  creating a call stack in this case. I mean, I think that, even if the
>  argument of f :: a -> State s a has a stricness flag, the value m0 ::
>  State s a is itself a function of the state (with type s); then the
>  value ((m0 >>= f) >>= f) >>= .....) >>= f is applied to a state s0,
>  this must be passed down to the bottom of the call stack to perform
>  the actual computation. And this may eat up a lot of heap space.

I don't think this is a problem if the expression associates the other 
way (as your program does), i.e.

    m0 >>= (\x -> f x >>= (\x -> f x >>= (\x -> f x >>= ... f)))

This can be tail recursive if there's enough strictness.

On a related note, it seems like it might be worth introducing

    (=>>=) :: Monad m => (a -> m b) -> (b -> m c) -> a -> m c

with a higher precedence than (>>=) and associating to the right, so 
that one could write

    m0 >>= f1 =>>= f2 =>>= ... =>>= fn

and avoid the inefficiency of the left-associative (>>=). Does this make 
any sense?

-- Ben



More information about the Haskell-Cafe mailing list