Gmane
From: Ulf Norell <ulfn <at> cs.chalmers.se>
Subject: Monad laws for fail
Newsgroups: gmane.comp.lang.haskell.libraries
Date: 2007-01-29 15:21:29 GMT (2 years, 22 weeks, 3 days, 20 hours and 36 minutes ago)
I tried out the recently released and very nice binary library and  
tripped up by laziness. Muchly simplified my problem was:

data Bad = Bad

instance Binary Bad where
   put = return ()
   get = do
     fail "this is bad"
     return Bad

Here I expected decoding to Bad to fail, but to my surprise:

ghci> decode (encode Bad) :: Bad
Bad

 From the example, it is clear that my brain has the following law  
for fail built in:

   fail err >> m  ===  fail err

Some testing reveals that this law is violated not only by the Get  
monad, but also by State, Reader, and Writer.
(There was a discussion about the strictness of the state monad a  
while back, I can't recall if this came up...)

So, where am I going wrong? Am I mixing up fail and mzero? Are there  
other laws for fail that actually hold?

/ Ulf