On 10/14/07, Dan Piponi <dpiponi@gmail.com> wrote:
On 10/14/07, Yitzchak Gale <gale@sefer.org> wrote:
Not very much, I suspect. That "monad" really is broken - it's not a monad at all.
Depending on your point of view, ListT isn't broken. It correctly transforms commutative monads into monads. The problem is that you can't express "commutative monad" any differently from "monad" in Haskell. And so it's been shoehorned into the wrong type class.
If desired, we could easily define a class for commutative monads, and then state that ListT m is only a monad if m is a commutative monad. For example, class Monad m => CommutativeMonad m instance (CommutativeMonad m) => Monad (ListT m) where return a = ListT (return [a]) etc. Naturally, it's up to the programmer to guarantee that instances of CommutativeMonad are actually commutative monads. -- Dave Menendez <dave@zednenem.com> <http://www.eyrie.org/~zednenem/>