PROPOSAL: Add Map/IntMap newtypes for different Monoid to containers

Mario Blažević blamario at ciktel.net
Sat Mar 25 14:43:01 UTC 2017


On 24/03/17 07:38 AM, Merijn Verstraaten wrote:
> Specifically, it's to add (let's use Foo as non-bikeshed name):
>
> newtype Foo k v = Foo (Map k v) deriving (...)
>
> instance (Ord k, Semigroup v) => Semigroup (Foo k v) where
>      Foo m1 <> Foo m2 = Foo (Map.unionWith (<>) m1 m2)
>
> and corresponding Monoid (which would have 'mempty = Foo Map.empty'), deriving all other instances from Map. And the same for IntMap. I don't particularly care whether the Monoid instance should have a Semigroup or Monoid constraint on 'v'.
>
> I've personally created this newtype a bunch of times (as have others in #haskell, apparently), but I've never needed/wanted the current Monoid instance. Now I realise that changing the Monoid instance is not happening, so instead I would simply like to add a newtype that has the (to me) more useful Monoid instance.

You have +1 from me. I've written this newtype a couple of times already 
for local use. I'd suggest also adding another newtype at the same time:

newtype LeftBiased k v = LeftBiased (Map k v) deriving (...)

instance Ord k => Semigroup (LeftBiased k v) where
     LeftBiased m1 <> LeftBiased m2 = LeftBiased (Map.union m1 m2)


     Then a future release of containers could deprecate the current 
Monoid instance of Map, and a future future release could remove it 
completely, and a far future release could replace it with the correct 
one. One can dream.

>> On 24 Mar 2017, at 11:59, Andreas Abel <abela at chalmers.se> wrote:
>>
>> Please make your proposal more specific.
>> (So that we can tear it apart, haha!)
>>
>> Seriously, I think it is to vague for starting a discussion.
>>
>> Best,
>> Andreas
>>
>> On 24.03.2017 11:36, Merijn Verstraaten wrote:
>>> I would like to propose adding a newtype wrapper (with all relevant instances) for Map and IntMap (if I missed any other applicable type in containers, let me know).
>>>
>>> This newtype should differ in Monoid/Semigroup instance from Map/IntMap by switching:
>>>
>>> Ord k => Semigroup (Map k v)
>>> Ord k => Monoid (Map k v)
>>>
>>> to:
>>>
>>> (Ord k, Semigroup v) => Semigroup (Map k v)
>>> (Ord k, Monoid v) => Monoid (Map k v) or (Ord k, Semigroup v) => Monoid (Map k v)
>>>
>>> Any opinions on the overall idea? Opinions on which Monoid instance? Bikeshed for the newtype names?
>>>
>>> Cheers,
>>> Merijn
>>>
>>>
>>>
>>> _______________________________________________
>>> Libraries mailing list
>>> Libraries at haskell.org
>>> http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
>>>
>>
>> --
>> Andreas Abel  <><      Du bist der geliebte Mensch.
>>
>> Department of Computer Science and Engineering
>> Chalmers and Gothenburg University, Sweden
>>
>> andreas.abel at gu.se
>> http://www.cse.chalmers.se/~abela/
>
>
> _______________________________________________
> Libraries mailing list
> Libraries at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries




More information about the Libraries mailing list