[Haskell-cafe] Declaring a tuple of instances of Enums as an instance of the Enum class

Henning Thielemann schlepptop at henning-thielemann.de
Tue May 25 14:30:05 EDT 2010


Daniel Fischer schrieb:
> On Sunday 23 May 2010 15:33:58, Ivan Lazar Miljenovic wrote:
>> R J <rj248842 at hotmail.com> writes:
>>> Say I've got a type "Month" declared as an instance of the "Enum"
>>> class, and a type "MonthPair" declared as a pair of months:
>>> data Month = January | February | March | April | May | June | July |
>>> August | September | October | November | December deriving (Eq, Enum,
>>> Ord, Show)
>>> type MonthPair = (Month, Month) deriving (Enum)
>>> The "deriving" on "MonthPair" gives me the error "parse error on input
>>> deriving'".
>> You can't derive instances for type aliases (as its mainly there for
>> documentation reasons, etc.).  However, pairs don't have Enum instances
>> by default so you still can't use its instance.
>>
>> If you define "data MonthPair = MonthPair Month Month" then you should
>> be able to derive Enum.
> 
> No, per the report (http://haskell.org/onlinereport/derived.html)
> 
> "Derived instance declarations for the class Enum are only possible for 
> enumerations (data types with only nullary constructors)."

You might define an instance more generally:

data EnumPair a b = EnumPair a b

instance (Enum a, Bounded b, Enum b) => Enum (EnumPair a b) where
   ...

Then define something like
  fromEnum (EnumPair a b) = (maxBound - minBound)*a + b

(needs still some asTypeOf's and fromEnum's)



More information about the Haskell-Cafe mailing list