[Haskell-cafe] instance Monoid a => Monad ((,) a)

Oleg Grenrus oleg.grenrus at iki.fi
Tue Aug 6 09:03:55 UTC 2019


There are All and Any Monoids in Data.Monoid

Sent from my iPhone

> On 5 Aug 2019, at 23.33, Jinxuan Zhu <zhujinxuan at 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 at 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.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20190806/b727a464/attachment.html>


More information about the Haskell-Cafe mailing list