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

Reply via email to