A more useful Monoid instance for Data.Map
Ben Gamari
bgamari.foss at gmail.com
Tue Mar 12 16:06:22 CET 2013
Roman Cheplyaka <roma at ro-che.info> writes:
> Great job!
>
> To be fair, there might be code which is not released on hackage (e.g.
> proprietary), but the current instance is so bad that we really should
> take a chance to fix it.
>
> But there's another problem... The "right" instance should really be
> based on Semigroup, not Monoid, but Semigroup is not currently in the
> base. And adding a dependency on semigroups to containers is hardly an
> option.
>
So as I understand it,
1) There are few packages on Hackage that would break as a result of
replacing Map's existing Monoid instance.
2) However, we may want to first cut a release with no Monoid instance
at all to alert users outside of Hackage of the change in
semantics. This was suggested for containers-0.6.
3) Dropping the Monoid instance would hurt current users
relying only on mempty. Moreover, those who do need a full Monoid
instance will be forced to define it themselves, incurring two
breakages (once on removal of the current instance and again on
reintroduction of the "correct" Monoid instance). This ultimately
reflects the current problems in refactoring our typeclass
structure.
4) As Johan points out in [1], refactoring the typeclass hierarchy is
currently painful. He says this needs to be fixed before this sort
of refactoring is attempted.
5) There are proposals[2] seeking to fix this issue but, as Edward
points out, it's unclear whether they will adequately solve the
problem[3]
6) As a result, the present proposal regarding Map's Monoid instance
is stuck
Sadly, I can see only a few places where this impass can be broken,
1) We decide it's not necessary to first drop the Monoid instance this
is unlikely to affect the current users on Hackage, this could be
very frustrating for external users. This would obviously need to
be very well advertised.
2) We decide it is acceptable to break users code multiple times, drop
the Monoid instance and reintroduce the new instance after some
delay. The length of this delay could range from no delay at all
(allowing folks to quickly move to the new instance, although
potentially unwittingly) to several months (hoping that most users
will realize the change during this window).
3) We miraculously resolve the typeclass refactoring problem, allowing
us to add Semigroup to base, add a Semigroup instance for Map, and
fix its Monoid instance in one fell swoop
While I agree with hvr that incurring more breakage events than
necessary is not desirable, I nevertheless think we should again
consider option (2) as,
* Semantic changes like (1) seem too reckless to undertake like this
* The (3) depends upon our ability to rectify deep problems in how
typeclasses are defined and refactored and will not be solved in the
near future
We should take advantage of this opportunity to begin an easy cleanup
and accept that there are still other issues that will need to be dealt
with once the tools for doing so exist.
Thoughts?
Cheers,
- Ben
[1] <CAK-tuPaNKkN2Bb5FNc9FaG8-z4OPwDi4WAXP5h0r3Wop_GCQDw at mail.gmail.com>
[2] http://hackage.haskell.org/trac/ghc/wiki/DefaultSuperclassInstances
[3] <CAJumaK8sp_fYed2t0LabeMYeUyV8ub+u=fM00EoBmv0GD_+OqA at mail.gmail.com>
More information about the Libraries
mailing list