
There are All and Any Monoids in Data.Monoid Sent from my iPhone
On 5 Aug 2019, at 23.33, Jinxuan Zhu
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
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.