Newbie qustion about monads

Juanma Barranquero jmbarranquero at laley.wke.es
Thu Oct 2 12:13:08 EDT 2003


I have an extremely-newbie question about monads and how to interpret
the monadic laws; I asked that same question yesterday on IRC and the
answers were interesting but non-conclusive (to me anyway).

I'm trying to learn monads by reading "All About Monads", version 1.0.2.

I though of defining a monad like that:

  data Counted a = Ct Int a

  instance Monad (Counted) where
       return x     = Ct 1 x
       Ct n x >>= f = let (Ct n' x') = f x in Ct (n+n') x'
       -- fail as default

The intent is that Counted objects "count" the number of times an
operation is applied to them. (For the purpose of the question, that's
irrelevant anyway: the problem would be the same if I assigned a random
number to the Int on each calling of >>=.)

According to "All About Monads", the first monadic law says:

  (return x) >>= f == f x 

In my case, let's suppose I define:

  reverseCounted :: [a] -> Counted [a]
  reverseCounted x = return (reverse x)

so I do:

  c1 = return "xxx" >>= reverseCounted   -- c1 == Ct 2 "xxx"
  c2 = reverseCounted "xxx"              -- c2 == Ct 1 "xxx"

Now comes the question: In what sense should I interpret the "==" in the
monadic law?

Obviously, c1 and c2 are not structurally equal. If I can accept that
two Counted things are "equal" even if they are not identical, is enough
for me to define:

  instance Eq a => Eq (Counted a) where
      Ct _ x == Ct _ y = x == y

to satisfy the first law?

Yesterday I was said that it'd work if c1 and c2 are mutually
substitutable. They are, for the purposes of equality, though evidently
not for every purpose. A simple:

  count (Ct n _) = n

allows me to distinguish between them.


                                                                Juanma




More information about the Haskell-Cafe mailing list