# Break `abs` into two aspects

Carter Schonwald carter.schonwald at gmail.com
Sat Feb 8 20:32:53 UTC 2020

On Sat, Feb 8, 2020 at 2:36 PM Zemyla <zemyla at gmail.com> wrote:

> Should we move the Semiring discussion to a new proposal?
>
> On Fri, Feb 7, 2020, 09:01 Carter Schonwald <carter.schonwald at gmail.com>
> wrote:
>
>> Derp. :)
>>
>> On Wed, Feb 5, 2020 at 9:08 PM Zemyla <zemyla at gmail.com> wrote:
>>
>>> "i" is an Integer there, which has an Ord instance.
>>>
>>> On Wed, Feb 5, 2020, 19:20 Carter Schonwald <carter.schonwald at 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 at 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
>>>>> > 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 mailing list
>>>>
>>>
-------------- next part --------------
An HTML attachment was scrubbed...