Thanks for sharing this viewpoint! I also like the “weighted set” intuition.
By adjusting the monoidal value type, we can reproduce several similar types (and use newtype
deriving to get instances of Semigroup
, Monoid
, and relevant subclasses):
newtype Map k v = Map (MonoidMap k (First v))
newtype Set k = Set (MonoidMap k (Maybe ()))
newtype MultiSet k = MultiSet (MonoidMap k (Sum Natural))
newtype SignedMultiSet k = SignedMultiSet (MonoidMap k (Sum Integer))
newtype MultiMap k v = MultiMap (MonoidMap k (Set v))
newtype ListMultiMap k v = ListMultiMap (MonoidMap k [v])