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

Ryan Ingram ryani.spam at gmail.com
Tue May 25 21:47:49 EDT 2010


Also, this way lies a bit of madness, since fromEnum/toEnum work on
Int, not Integer.

This means
   EnumPair (EnumPair Month Month) (EnumPair Month Month) overflows

  -- ryan

On Tue, May 25, 2010 at 11:30 AM, Henning Thielemann
<schlepptop at henning-thielemann.de> wrote:
> 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)
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>


More information about the Haskell-Cafe mailing list