<div dir="ltr"><div>> <span style="font-size:12.8000001907349px">1. GHC 7.12 will include Semigroup and NonEmpty in base. All Monoid</span></div><span style="font-size:12.8000001907349px">instances, and anything else which forms a Semigroup, will have a Semigroup</span><br style="font-size:12.8000001907349px"><span style="font-size:12.8000001907349px">instance. GHC will issue a warning when it encounters an instance of Monoid</span><br style="font-size:12.8000001907349px"><span style="font-size:12.8000001907349px">which is not an instance of Semigroup.</span><div><br></div><div>There is going to be some push-back on this proposal from those that point out the lack of mempty makes Semigroup less rigorous that a Monoid. That concept can create a debate around what is "anything else which forms a semigroup".</div><div>I would try to amend the proposal to something much more specific.</div><div>Here is how I have used Semigroup</div><div><br></div><div>1) a structure that is already a Monoid</div><div>2) a structure that is a non-empty form of a Monoid</div><div>3) a structure where mempty is not constant but a function of the element you would concatenate it to</div><div><br></div><div>An example of 3) is concatenating bounding boxes. A zeroed box is certainly an empty box, but it will create a larger box when concatenated with an existing box.The identity concatenation of the current bounding box is always the current bounding box.</div><div><br></div><div>What other structures do you use Semigroup for?</div><div>Are there structures in base where there would be a debate about adding an instance?</div><div>Can we come up with rules for when a Semigroup instance should be added to base?</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Mar 29, 2015 at 5:20 AM, Jeremy <span dir="ltr"><<a href="mailto:voldermort@hotmail.com" target="_blank">voldermort@hotmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">The proposal to make Semigroup a superclass of Monoid was discussed a while<br>
ago [1], and the conclusion was to "put this off until the dust has settled<br>
from the AMP and FT changes".<br>
<br>
Now that 7.10 is out, I would like to re-propose. The proposed plan is<br>
similar to AMP, but less invasive, as (in my subjective experience)<br>
user-defined Monoids are much less common than user-defined Monads.<br>
<br>
1. GHC 7.12 will include Semigroup and NonEmpty in base. All Monoid<br>
instances, and anything else which forms a Semigroup, will have a Semigroup<br>
instance. GHC will issue a warning when it encounters an instance of Monoid<br>
which is not an instance of Semigroup.<br>
<br>
2. GHC >7.12 will define Monoid as a subclass of Semigroup.<br>
<br>
Stage 2 could be delayed - or in the extreme case, cancelled - if the<br>
warnings following stage 1 indicate that the proposal would cause<br>
significant breakage of existing code, although this is not anticipated.<br>
<br>
The rationale for this change is:<br>
<br>
1. Semigroup is a popular package (this is relevant in combination with the<br>
following point).<br>
2. Using an existing Monoid as a Semigroup requires redefining it (or<br>
WrappedMonoid), leading to much boilerplate and duplication.<br>
3. NonEmpty is often redefined by beginners (or those who don't think it's<br>
worth having an extra dependency for).<br>
<br>
[1] <a href="https://mail.haskell.org/pipermail/libraries/2013-June/020188.html" target="_blank">https://mail.haskell.org/pipermail/libraries/2013-June/020188.html</a><br>
<br>
<br>
<br>
--<br>
View this message in context: <a href="http://haskell.1045720.n5.nabble.com/Proposal-Make-Semigroup-as-a-superclass-of-Monoid-tp5767835.html" target="_blank">http://haskell.1045720.n5.nabble.com/Proposal-Make-Semigroup-as-a-superclass-of-Monoid-tp5767835.html</a><br>
Sent from the Haskell - Libraries mailing list archive at Nabble.com.<br>
_______________________________________________<br>
Libraries mailing list<br>
<a href="mailto:Libraries@haskell.org">Libraries@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries</a><br>
</blockquote></div><br></div>