home *** CD-ROM | disk | FTP | other *** search
/ PSION CD 2 / PsionCDVol2.iso / Programs / 876 / hugs.sis / Number.hs < prev    next >
Encoding:
Text File  |  2000-09-21  |  3.8 KB  |  130 lines

  1. -----------------------------------------------------------------------------
  2. -- Number.hs:    Fixed width integers with overflow detection
  3. --
  4. -- This library defines a numeric datatype of fixed width integers
  5. -- (whatever Int supplies).  But, unlike Int, overflows are detected and
  6. -- cause a run-time error.  Covers all classes upto and including Bounded
  7. -- and Ix.  A fairly messy hack, but it works (most of the time :-) ...
  8. --
  9. -- Suitable for use with Hugs 98
  10. -----------------------------------------------------------------------------
  11.  
  12. module Number( 
  13.     Number,
  14.     -- instance Eq       Number,
  15.     -- instance Ord      Number,
  16.     -- instance Show     Number,
  17.     -- instance Enum     Number,
  18.     -- instance Num      Number,
  19.     -- instance Bounded  Number,
  20.     -- instance Real     Number,
  21.     -- instance Ix       Number,
  22.     -- instance Integral Number,
  23.     ) where
  24.  
  25. import Ix(Ix(..))
  26.  
  27. default (Number,Int,Float)
  28.  
  29. type Number = Int
  30.   in numEq           :: Number -> Number -> Bool,
  31.      numCmp          :: Number -> Number -> Ordering,
  32.      numShowsPrec    :: Int -> Number -> ShowS,
  33.      numEnumFrom     :: Number -> [Number],
  34.      numEnumFromThen :: Number -> Number -> [Number],
  35.      numAdd          :: Number -> Number -> Number,
  36.      numSub          :: Number -> Number -> Number,
  37.      numMul          :: Number -> Number -> Number,
  38.      numNeg          :: Number -> Number,
  39.      numFromInt      :: Int -> Number,
  40.      numToInt        :: Number -> Int,
  41.      numFromInteger  :: Integer -> Number,
  42.      numToInteger    :: Number -> Integer,
  43.      numMax          :: Number,
  44.      numMin          :: Number,
  45.      numSignum       :: Number -> Number,
  46.      numToRat        :: Number -> Rational,
  47.      numQrm          :: Number -> Number -> (Number, Number),
  48.      numRange        :: (Number, Number) -> [Number],
  49.      numIndex        :: (Number, Number) -> Number -> Int,
  50.      numInRange      :: (Number, Number) -> Number -> Bool
  51.  
  52. numEq           = (==)
  53. numCmp          = compare
  54. numShowsPrec    = showsPrec
  55. numEnumFrom     = enumFrom
  56. numEnumFromThen = enumFromThen
  57. numFromInt x    = x
  58. numToInt x      = x
  59. numFromInteger  = fromInteger
  60. numToInteger    = toInteger
  61. numMax          = maxBound
  62. numMin          = minBound
  63. numSignum       = signum
  64. numToRat        = toRational
  65. numQrm          = quotRem
  66. numRange        = range
  67. numIndex        = index
  68. numInRange      = inRange
  69.  
  70. numAdd x y = if xsgn/=ysgn || xsgn==rsgn then r else error "add overflow!"
  71.              where xsgn = x>=0
  72.                    ysgn = y>=0
  73.                    rsgn = r>=0
  74.                    r    = x + y
  75.  
  76. numSub x y = if xsgn==ysgn || ysgn/=rsgn then r else error "sub overflow!"
  77.              where xsgn = x>=0
  78.                    ysgn = y>=0
  79.                    rsgn = r>=0
  80.                    r    = x - y
  81.  
  82. numMul x y = if y==0 || (r `div` y == x) then r else error "mult overflow!"
  83.              where r = x * y
  84.  
  85. numNeg x   = if x>=0 || r>=0 then r else error "negate overflow!"
  86.              where r = negate x
  87.  
  88. instance Eq Number where
  89.   (==)   = numEq
  90.  
  91. instance Ord Number where
  92.   compare = numCmp
  93.  
  94. instance Show Number where
  95.   showsPrec = numShowsPrec
  96.  
  97. instance Enum Number where
  98.   toEnum       = numFromInt
  99.   fromEnum     = numToInt
  100.   enumFrom     = numEnumFrom
  101.   enumFromThen = numEnumFromThen
  102.  
  103. instance Num Number where
  104.   (+)         = numAdd
  105.   (-)         = numSub
  106.   (*)         = numMul
  107.   negate      = numNeg
  108.   fromInt     = numFromInt
  109.   fromInteger = numFromInteger
  110.   abs x       = if x<0 then negate x else x
  111.   signum      = numSignum
  112.  
  113. instance Bounded Number where
  114.   minBound    = numMin
  115.   maxBound    = numMax
  116.  
  117. instance Real Number where
  118.   toRational  = numToRat
  119.  
  120. instance Ix Number where
  121.   range   = numRange
  122.   index   = numIndex
  123.   inRange = numInRange
  124.  
  125. instance Integral Number where
  126.   quotRem   = numQrm
  127.   toInteger = numToInteger
  128.  
  129. -----------------------------------------------------------------------------
  130.