On Apr 23, 2012, at 4:34 PM, Stefan Holdermans wrote: > Sjoerd, > >>>> This is not just about map, but it also a problem for the Monoid instance. >>>> You are basically adding an extra identity element, 0, to the max monoid, >>>> which works but is weird. > >>> Still that's how union is typically defined for hybrid sets. It's what >>> happens if want union and empty to behave as generalisations of these >>> concepts for ordinary (multi)sets. > >> Then why would you want that? > > You don't have to. (SignedMultiset a, additiveUnion, empty) gives you the > Monoid that you seem to have a preference for. The library supplies it > through the Additive wrapper. The point is that you have a choice: different > applications may ask for different monoidal structures.
Agreed. But I just can't imagine that the other instance is in any way useful. You basically define a function max': max' :: Int -> Int -> Int max' 0 b = b max' a 0 = a max' a b = max a b i.e. max' -2 -1 = -1 max' -2 0 = -2 max' -2 1 = 1 Wouldn't you agree that if you saw this defined in some code, you'd think something is wrong? > *Data.SignedMultiset> let empty' = multiply 0 $ delete () empty > > *Data.SignedMultiset> empty' `union` delete () empty == empty' > True > > *Data.SignedMultiset> empty `union` delete () empty == delete () empty > True And this doesn't bother you? greetings, Sjoerd _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe