
2009/04/22 Daniel Carrera
1) Am I right in thinking that any type with two elements ("m a") is always a Monad? (IO String, Maybe Int, etc).
Well, no. Many such types are monads but not all of them. Monads have the monadic operations `return` and `>>=`.
2) When I say "m a >>= f" the >>= just pulls the "a" out of "m a" and passes it to "f". Right?
Yes. The `>>=` operators defines our evaluation strategy; it allows us to combine computations. Be carefult of confusing `m` (a type constructor) with the value constructors for a particular monad.
3) The last two properties are not comparing values but functions. Right? For example, reading the second-last property:
(m >>= return) :: a -> m a
Not quite -- `someMonadicValue >>= return` is of type `m a`.
Where (m >>= return) is defined by (\x -> m x >>= return). Right? And this is why you can write the last property:
(k >>= h) :: a -> h a defined by (\x -> k a >>= h) This is what allows us to make (k >>= h) the second argument of ">>=" as in the last property:
Actually, the third law is: (m >>= f) >>= g = m >>= (\x -> f x >>= g) -- Jason Dusek