Bool is also a monoid under xor.

On Mon, Aug 5, 2019, 4:34 PM Jinxuan Zhu <zhujinxuan@gmail.com> wrote:
Hi, I think the error message says there is no Monoid for Bool.  It is because Bool can be monoid by either || or && operations, which would lead to ambiguity if Bool is monoid by default.

You can:
1. use Maybe Unit instead
2. (overkill) Define AndMonoid Bool newtype and use DeriveVia and coerce



On Fri, Aug 2, 2019 at 7:39 PM Benjamin Franksen <ben.franksen@online.de> wrote:
I wanted to define a simple Monad instance for (Bool,) as

instance Monad ((,) Bool) where
  return x = (False, x)
  (True, x) >>= k = (True, snd (k x))
  (False, x) >>= k = k x
  -- or: (b, x) >>= k = let (c, y) = k x in (b||c, y)

The idea was to keep track of whether functions change their input value
or not.

To my astonishment I found that this definition overlaps with an
existing one. GHC tells me

x.hs:2:10: error:
    • No instance for (Monoid Bool)
        arising from the superclasses of an instance declaration
    • In the instance declaration for ‘Monad ((,) Bool)’
  |
2 | instance Monad ((,) Bool) where
  |          ^^^^^^^^^^^^^^^^

x.hs:2:10: error:
    • Overlapping instances for Monad ((,) Bool)
        arising from a use of ‘GHC.Base.$dm>>’
      Matching instances:
        instance Monoid a => Monad ((,) a) -- Defined in ‘GHC.Base’
        instance Monad ((,) Bool) -- Defined at x.hs:2:10
    • In the expression: GHC.Base.$dm>> @((,) Bool)
      In an equation for ‘>>’: (>>) = GHC.Base.$dm>> @((,) Bool)
      In the instance declaration for ‘Monad ((,) Bool)’
  |
2 | instance Monad ((,) Bool) where
  |          ^^^^^^^^^^^^^^^^

[one more similar overlap error elided]

But I could not find the

  instance Monoid a => Monad ((,) a)

documented anywhere in the base package. Should I look harder? Or is
this instance accidentally leaking from GHC.Base?

Eventually, through some experimenting I found that if I replace Bool
with Any, then the existing instance seems to do what I want.

Cheers
Ben

_______________________________________________
Haskell-Cafe mailing list
To (un)subscribe, modify options or view archives go to:
http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
Only members subscribed via the mailman list are allowed to post.
_______________________________________________
Haskell-Cafe mailing list
To (un)subscribe, modify options or view archives go to:
http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
Only members subscribed via the mailman list are allowed to post.