And by "works", I mean, ListT is is a monad only if the internal monad is commutative.
On Fri, Jan 28, 2011 at 2:46 PM, Daniel Peebles <pumpkin...@gmail.com>wrote: > Beware of ListT. It only works if your internal monad is commutative, which > IO is not. (Maybe would work, for example) > > > On Fri, Jan 28, 2011 at 2:41 PM, Chris Smith <cdsm...@gmail.com> wrote: > >> On Fri, 2011-01-28 at 11:20 -0800, michael rice wrote: >> > The first and third work, but not the second. Why? >> >> When you use a do block, it can be the syntactic sugar for whatever >> monad you like; but you do have to make a choice. Your first example >> had a do block for the IO monad. Your third example used the [] monad. >> Both are fine. >> >> The second, though, wasn't clear on what monad it was using. When you >> used the (<-) syntax to nondeterministically choose from a list, the >> compiler settled upon the [] monad. But then the next line was a >> statement in the IO monad. That's inconsistent, hence the error. >> >> Perhaps you wanted to build a monad out of both behaviors? In this >> case, you should likely look into monad transformers, and in particular, >> the ListT monad transformer in the List package. This would allow you >> to write the code you did in a monad called ListT IO, except that the IO >> actions would need to be lifted through the use of either `lift` or >> `liftIO`. >> >> -- >> Chris Smith >> >> >> _______________________________________________ >> Haskell-Cafe mailing list >> Haskell-Cafe@haskell.org >> http://www.haskell.org/mailman/listinfo/haskell-cafe >> > >
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe