A logical definition of Enum (to me wearing a mathematical hat)
would be
succ x = min { y | y > x}
For Ratio this makes no sense, ergo Ratio should not be an
instance of Enum. For Float and Doubles it makes a lot of
sense (giving nextAfter, which is a commonly used IEEE function not
otherwise available).
The Prelude is wrong in two ways with Floats/Doubles:
(1) It thinks Float and Double are continuous types.
(2) It doesn't say what happens when you do
succ(1.0e20) (assuming 1.0e20 is too big for Int).
I wonder if anyone can guess what answer Hugs gives for
"succ 1.0e20" ?
Solution - remove the current definitions of Enum and replace
with the simple mathematical one . . .