Should we move the Semiring discussion to a new proposal?

On Fri, Feb 7, 2020, 09:01 Carter Schonwald <carter.schonwald@gmail.com> wrote:
Derp. :)

On Wed, Feb 5, 2020 at 9:08 PM Zemyla <zemyla@gmail.com> wrote:
"i" is an Integer there, which has an Ord instance.

On Wed, Feb 5, 2020, 19:20 Carter Schonwald <carter.schonwald@gmail.com> wrote:
Num doesn't have Ord as a parent constraint any more ... Though i suppose that works as a default signature instance?

On Wed, Feb 5, 2020 at 3:19 PM Mario Blažević <mblazevic@stilo.com> wrote:
On 2020-02-04 11:32 a.m., Zemyla wrote:
> It really doesn't matter if it's not "interesting" or not surjective for
> some Semirings. It should be included, because:

        I fully agree, and I'll add another reason you left out. The presence
of fromNatural would allow defaulting of Num's fromInteger as

 > fromInteger i
 >     | i >= 0 = fromNatural (fromInteger i)
 >     | otherwise = negate . fromInteger . negate $ i


> (a) Even for semirings where it is "interesting", it's not surjective
> (for instance, Rational or Double)
> (b) It's a method with a default definition, so you don't have to expend
> any mental effort on it
> (c) A lot of instances have uninteresting methods: for instance, (*>)
> and (<*) for Applicative ((->) e) are const id and const respectively.
> Haskell adds methods to classes when they're always possible and
> sometimes useful/interesting/faster, rather than when they're always
> interesting.
> (d) It's useful for Semiring-generic methods and instances.
> (e) It can achieve an asymptotic speedup on some instances. Like, if you
> have Semiring a => Semiring (f a) for some type f, then you can have
> fromNatural n = pure (fromNatural n) instead of doing the whole O(log n)
> song and dance with the default definition. Also, your example admits a
> simple definition:
>    fromNatural n = if n == 0 then S.empty else S.singleton True
> (f) "zero" and "one" can be defined in terms of fromNatural, for
> programmers who only need to define that:
>    zero = fromNatural 0
>    one = fromNatural 1
> This leads to the MINIMAL pragma on Semiring being {-# MINIMAL plus,
> times, (zero, one | fromNatural) #-}
> (g) If it's not included in the class, but in some subclass
> (NaturalSemiring, you proposed), but it's possible from the class, then
> people will just define and use the O(log n) version instead of
> requiring the subclass, leading to wasted effort and duplicated code.

_______________________________________________
Libraries mailing list
Libraries@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
_______________________________________________
Libraries mailing list
Libraries@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries