練習問題 2.4.4.

a
および
b
がともに型クラス
Enum
のインスタンスであるとき,
(a,b)
Enum
のインスタンスとして宣言することは可能か.



たとえば,以下のようにすれば可能

instance (Enum a, Enum b) => Enum (a,b) where
  fromEnum (x,y) = if ix >= iy then ix^2 + iy else (iy + 1)^2 - ix -1
    where  ix = fromEnum x
           iy = fromEnum y
  toEnum i = if i-o2 <= o'2 - i then (toEnum o,toEnum d)
             else (toEnum d',toEnum o)
    where o  = floor (sqrt (fromIntegral i))
          o2  = o    ^2
          o'2 = (o+1)^2
          d   = i   - o2
          d'  = o'2 - i - 1