<div dir="auto">I'm moderately opposed, on the basis that the Enum class is too fundamentally broken/meaningless to be worth fiddling with. It attempts to serve multiple barely-related purposes at once, and serves none of them terribly well.</div><div class="gmail_extra"><br><div class="gmail_quote">On Dec 13, 2017 11:17 PM, "M Farkas-Dyck" <<a href="mailto:strake888@gmail.com">strake888@gmail.com</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I propose to add some new methods of `Enum`:<br>
<br>
class Enum a where<br>
    ...<br>
<br>
    predMay, succMay :: a -> Maybe a<br>
    toEnum' :: Integer -> Maybe a<br>
    fromEnum' a -> Integer<br>
<br>
Rationale for `fromEnum'` and `toEnum'`:<br>
<br>
The docs for `Enum` now say the minimal complete definition is `toEnum` and `fromEnum`, but this is not enough to have sane default instances of the other methods, for example:<br>
<br>
data ABC = A | B | C deriving Show<br>
instance Enum ABC where<br>
    toEnum 0 = A<br>
    toEnum 1 = B<br>
    toEnum 2 = C<br>
    fromEnum A = 0<br>
    fromEnum B = 1<br>
    fromEnum C = 2<br>
<br>
main = print [A ..] -- [A,B,C,*** Exception: Non-exhaustive patterns in function toEnum<br>
<br>
In this case one could merely derive `Enum`, but not in some other cases, e.g. numeric types or GADTs. It is not possible to do better defining `toEnum` and `fromEnum` alone.<br>
<br>
If we default-define `toEnum'` and `fromEnum'` and their evil (i.e. partial) syblings in terms of each other, the user need merely define the total methods.<br>
<br>
Using `Integer` rather than `Int` allows these methods to not fail for types larger than an `Int`, which are not uncommon on 32-bit systems.<br>
<br>
Rationale for `predMay` and `succMay`:<br>
<br>
I include these partly for completeness, but `predMay` can not now be defined in general, and `succMay` only cumbersomely in terms of `enumFrom`.<br>
<br>
Note: All rationales imply "unless one uses `unsafePerformIO`". I'd rather not, myself.<br>
<br>
______________________________<wbr>_________________<br>
Libraries mailing list<br>
<a href="mailto:Libraries@haskell.org" target="_blank">Libraries@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bi<wbr>n/mailman/listinfo/libraries</a><br>
</blockquote></div></div>