Jonathan Cast jonathanccast at fastmail.fm
Mon Feb 11 10:34:36 EST 2008

```On 11 Feb 2008, at 5:33 AM, Deokjae Lee wrote:

> tutorial "All About Monads" says that "It is up to the programmer to
> ensure that any Monad instance he creates satisfies the monad laws".
>
> The following is one of the laws.
>
> (x >>= f) >>= g == x >>= (\v -> f v >>= g)
>
> However, this seems to me a kind of mathematical identity.

What do you mean by identity?  It's easy enough to violate:

newtype Gen a = Gen (StdGen -> a)
runGen :: Gen a -> StdGen -> a
runGen (Gen f) = f
return x = Gen (const x)
a >>= f = Gen (\ r -> let (r1, r2) = split r in runGen (f (runGen
a r1)) r2) [1]

split returns two generators independent of each other and of its
in the sense of equality.  So, for example, the program

do
x <- a
return x

denotes a random variable independent of (and hence distinct from)
a.  In general, you want some kind of backstop `equality' (e.g., that
the monad laws hold in the sense of identical distribution) when you
violate them; otherwise, you will violate the expectations your users
have from the syntax of the do notation.

jcc

[1] Test.QuickCheck
```