First of all, ListT is not a monad transformer, since it breaks the
law of associativity of bind:
*Control.Monad.List> let one = (lift $ putStrLn "1") :: ListT IO ()
*Control.Monad.List> let two = (lift $ putStrLn "2") :: ListT IO ()
*Control.Monad.List> let choice = return 1 `mplus` return 2 ::
It appears to me that the MonadPlus instance for ListT breaks the
following MonadPlus law
m >> mzero = mzero
I've tried with every implementation of ListT I could find - the one
in mtl, transformers, List, even "ListT done right" and it's
alternative. They all seem to violate the above la