Re: Enum and bounded instances for (,) and Either
Carter Schonwald <[email protected]>
| Newsgroups | gmane.comp.lang.haskell.libraries |
|---|---|
| Message-ID | <CAHYVw0ySO649sqqeYH_fDB8Cp8yAt7ccvCDLjwwQZ9z4fTbE_Q@mail.gmail.com> |
This raises a good point: enum as it currently exists is pretty bad and not well behaved ! On Sat, May 15, 2021 at 10:54 AM Zemyla <[email protected]> wrote: > We can't write instances of Enum for (,) and Either until we have total > versions of pred and succ. > > On Wed, May 12, 2021, 20:11 Carter Schonwald <[email protected]> > wrote: > >> *while we could >> >> Perhaps we should provide these flavors via new types and thus folks >> could still benefit from these instances by way of deriving via ? >> >> On Wed, May 12, 2021 at 6:38 PM Carter Schonwald < >> [email protected]> wrote: >> >>> isnt there also the issue that while we good provide newtypes for >>> various choices of product of enum instance => enum of products, there >>> literally quite easily 3 valid instances we could concoct (and many more >>> besides) >>> >>> "row by row" >>> "column by column" >>> "diagonalization" >>> etc? >>> that is: each of these is just as valid? >>> >>> On Wed, May 12, 2021 at 5:46 PM Edward Kmett <[email protected]> wrote: >>> >>>> Nothing indicates that minBound is >= 0. >>>> >>>> So if you want to deal with a modulus properly you need to deal with a >>>> modulus of something like maxBound - minBound + 1 (after appropriately >>>> upcasting intermediate results to a large enough type to contain that >>>> range). >>>> >>>> You also run into range issues pretty early on, and then scenarios like >>>> the instances for Float that are even wonkier. >>>> >>>> If toEnum/fromEnum went to a larger type (Integer or Natural) and we >>>> didn't have the wonkier Float instances and the like this would be a much >>>> easier sell. As it is I find myself rather uncomfortable with the shakiness >>>> of the foundations this thing rests upon. >>>> >>>> Sent from my iPhone >>>> >>>> On May 12, 2021, at 10:53 AM, Sandy Maguire <[email protected]> >>>> wrote: >>>> >>>> >>>> Hi all, >>>> >>>> Found myself puzzled the other day when I wanted an (Enum a, Enum b) >>>> => Enum (a, b) instance, and was distraught that it didn't exist. >>>> >>>> The following is a reasonable implementation: >>>> >>>> >>>> instance (Bounded b, Enum a, Enum b) => Enum (a, b) where >>>> fromEnum (a, b) = (fromEnum (maxBound @b) + 1) * fromEnum a + >>>> fromEnum b >>>> toEnum n = >>>> let bound = fromEnum (maxBound @b) + 1 >>>> b = n `rem` bound >>>> a = n `div` bound >>>> in (toEnum a, toEnum b) >>>> >>>> And, while we're at it, might as well add canonical instances for >>>> Either: >>>> >>>> >>>> instance (Bounded a, Bounded b) => Bounded (Either a b) where >>>> minBound = Left minBound >>>> maxBound = Right maxBound >>>> >>>> instance (Bounded a, Enum a, Enum b) => Enum (Either a b) where >>>> toEnum i = >>>> let bound = fromEnum (maxBound @a) + 1 >>>> in case i < bound of >>>> True -> Left $ toEnum i >>>> False -> Right $ toEnum $ i - bound >>>> fromEnum (Left a) = fromEnum a >>>> fromEnum (Right b) = fromEnum b + fromEnum (maxBound @a) + 1 >>>> >>>> Are there any reasons these instances are missing from base? >>>> >>>> Cheers, >>>> Sandy >>>> >>>>> >>>>> _______________________________________________ >>>> Libraries mailing list >>>> [email protected] >>>> http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries >>>> >>>> _______________________________________________ >>>> Libraries mailing list >>>> [email protected] >>>> http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries >>>> >>> _______________________________________________ >> Libraries mailing list >> [email protected] >> http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries >> > _______________________________________________ Libraries mailing list [email protected] http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries