Zuletzt geändert: So, 23.07.2006

«K12/K13» Z.hs «PDF», «POD»



Download
{-# 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