[Haskell-cafe] Monad transformers [Stacking monads]

Andrew Coppin andrewcoppin at btinternet.com
Tue Oct 7 14:27:57 EDT 2008

The good news: I managed to turn ResultSet into a monad transformer. 
Yay, me!

The bad news: It generates the entire result set before returning 
anything to the caller.

In other words, it works perfectly for finite result sets, and locks up 
forever on infinite result sets. Since the entire *point* of the monad 
is to handle infinite result sets correctly, that's kind-of a problem. 
And one that I see absolutely no way of fixing. :-(

Basically, the core code is something like

  raw_bind :: (Monad m) => [[x]] -> (x -> m (ResultSet y)) -> m 
(ResultSet y)
  raw_bind [] f = return empty
  raw_bind (xs:xss) f = do
    rsYs <- mapM f xs
    rsZ <- raw_bind xss f
    return (foldr union (cost rsZ) rsYs)

As you can see, this generates all of rsZ before attempting to return 
anything to the caller. And I'm really struggling to see any way to 
avoid that.

More information about the Haskell-Cafe mailing list