On 2 March 2010 15:44, Luke Palmer <[email protected]> wrote: > On Tue, Mar 2, 2010 at 1:17 PM, David Sabel > <[email protected]> wrote: > > Hi, > > when checking the first monad law (left unit) for the IO-monad (and also > for > > the ST monad): > > > > return a >>= f ≡ f a > > > > I figured out that there is the "distinguishing" context (seq [] True) > which > > falsifies the law > > for a and f defined below > > > > > >> let a = True > >> let f = \x -> (undefined::IO Bool) > >> seq (return a >>= f) True > > True > >> seq (f a) True > > *** Exception: Prelude.undefined > > > > Is there a side-condition of the law I missed? > > No, IO just doesn't obey the laws. However, I believe it does in the > seq-free variant of Haskell, which is nicer for reasoning. In fact, > this difference is precisely what you have observed: the > distinguishing characteristic of seq-free Haskell is that (\x -> > undefined) == undefined, whereas in Haskell + seq, (\x -> undefined) > is defined. > > In GHC 6.12.1 both expressions reduce to True, but it doesn't happen in GHC 6.10.4. Any ideas why the behaviour is different?
-- Andrés
_______________________________________________ Haskell-Cafe mailing list [email protected] http://www.haskell.org/mailman/listinfo/haskell-cafe
