[Haskell-cafe] Re: what is inverse of mzero and return?

Jules Bean jules at jellybean.co.uk
Mon Jan 24 05:47:30 EST 2005

On 24 Jan 2005, at 10:32, Keean Schupke wrote:

> Right, but we are dealing with the type system here. Remember Haskell
> monoids are functors on types, not on values ... (ie the base objects 
> the
> 'category theory' is applied to are the types not the values)...
> Therefore we only consider the types when considering Monads.

This is not true.

Here are the three monad laws as written on the nomaware site:

	1.  	(return x) >>= f == f x
	2.  	m >>= return == m
	3.  	(m >>= f) >>= g == m >>= (\x -> f x >>= g)

Taking rule 1, we do not simply mean that return x >>= f and f x have 
the same type. (This is obviously true). We require that they are equal 
as values of the type m a. In the case of IO, this means that they 
perform the same action before yielding the same result.


return "hello" >>= putStrLn

this does not only have the same type as putStrLn "hello", and return 
the same value (), but it also carries out exactly the same actions.

If it was simply enough that it have the same type, then it would be 
'good enough' if

return "hello" >>= putStrLn

had the same effect as

putStrLn "goodbye"

...which has the same type, and the same return value.

Aside: you said a couple of messages ago:

> Yes it is, side effects are quite clearly not counted. The value
> of (putStrLn "Hello" >> mzero") is mzero.

This concept of 'value' only makes sense in some monads. In the List 
monad there can be many 'values' of a computation. It just happens that 
IO 'returns' a 'single value' all the time.


More information about the Haskell-Cafe mailing list