{-# OPTIONS_GHC -fglasgow-exts #-} module Z where import EqClass data Z n = Z (n,n) type Z' n = EqClass (Z n) instance (Integral n) => Show (Z n) where show n = "Z[" ++ show (toInteger n) ++ "]" instance (Num n, Eq n) => Eq (Z n) where (Z (a,b)) == (Z (c,d)) = a + d == b + c instance (Num n, Integral n) => Num (Z n) where (Z (a,b)) + (Z (c,d)) = Z (a+c, b+d) (Z (a,b)) - (Z (c,d)) = Z (a+d, b+c) (Z (a,b)) * (Z (c,d)) = Z (a*c + b*d, a*d + b*c) signum (Z (a,b)) | a == b = 0 signum (Z (a,b)) | a < b = -1 signum (Z (a,b)) | b < a = 1 abs x = x * signum x fromInteger n | n == 0 = Z (0,0) fromInteger n | n > 0 = Z (fromInteger n, 0) fromInteger n | n < 0 = Z (0, fromInteger n) instance (Integral n) => Integral (Z n) where div = undefined toInteger (Z (a,b)) = toInteger a - toInteger b instance (Num n, Ord n) => Ord (Z n) where (Z (a,b)) <= (Z (c,d)) = a + d <= b + c instance (Num n, Integral n) => Enum (Z n) where succ = (+ 1) pred = subtract 1 toEnum = fromInteger . fromIntegral fromEnum = fromIntegral . toInteger instance (Real n, Integral n) => Real (Z n) where toRational = toRational . toInteger
Download