Re: Enum and bounded instances for (,) and Either

Carter Schonwald <[email protected]>
Newsgroups gmane.comp.lang.haskell.libraries
Message-ID <CAHYVw0ztj717SAOmC-YusskRzah9j8BevZ6FpAX8g=LU7TmN9w@mail.gmail.com>
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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.