Broken monad laws
Iavor Diatchki
iavor.diatchki at gmail.com
Wed Nov 23 17:45:04 EST 2005
Hello,
I just noticed that the GHC/Hugs "standard" libraries have acquired a
list monad transformer, which is broken, because it does not satisfy
the associativity law when applied to non-commutative monads. I am
not referring to some corner-case strictness problem, but rather a
fairly well known result. The associativity law is important, because
without it the 'do' notation can be very confusing. Bellow is an
example, for people not familiar with the porblem.
-Iavor
import Control.Monad.List
say :: String -> ListT IO ()
say x = lift (putStr x)
one_two, ex1,ex2 :: ListT IO ()
one_two = say "1 " `mplus` say "2 "
ex1 = do one_two
say "3 "
say "4 "
ex2 = do do one_two
say "3 "
say "4 "
main = runListT ex1 >> putStrLn " or " >> runListT ex2
More information about the Libraries
mailing list