Haskell 2: Enum Classes

Ashley Yakeley ashley@semantic.org
Wed, 24 Oct 2001 18:14:47 -0700

OK, I'm from the school of thought that prefers everything to have a 
precise meaning, even if it means "multiplying entities". The fact is, in 
Haskell 98 the 'Enum' class does extensive multiple duty.

data Type a = Type

class Enum a where
     predMaybe,succMaybe :: a -> Maybe a

class (Enum a) => BoundedStartEnum a where
     nthValueFromStart :: Integer -> a
     valueNthFromStart :: a -> Integer

class (Enum a) => BoundedEndEnum a where
     nthValueFromEnd :: Integer -> a
     valueNthFromEnd :: a -> Integer

class (BoundedStartEnum a,BoundedEndEnum a) => FiniteEnum a where
     predWrap,succWrap :: a -> a
     nValues :: Type a -> Integer

class (Enum a) => UnboundedStartEnum a where
     pred :: a -> a

class (Enum a) => UnboundedEndEnum a where
     succ :: a -> a

Of course, Float, Double and Rational would not be instances of any of 
these classes. If you need 'add one', 'subtract one' functions, those go 
with numeric classes, which many Enum types would not be instances of. 
For instance, the letter 'q' is the successor of the letter 'p', but that 
does not mean that "'q' = 'p' + 1" is meaningful.

Ashley Yakeley, Seattle WA