Merge branch 'master' into type-nats
[packages/base.git] / GHC / Num.lhs
1 \begin{code}
2 {-# LANGUAGE Trustworthy #-}
3 {-# LANGUAGE NoImplicitPrelude, MagicHash, UnboxedTuples #-}
4 {-# OPTIONS_HADDOCK hide #-}
5 -----------------------------------------------------------------------------
6 -- |
7 -- Module      :  GHC.Num
8 -- Copyright   :  (c) The University of Glasgow 1994-2002
9 -- License     :  see libraries/base/LICENSE
10 --
11 -- Maintainer  :  cvs-ghc@haskell.org
12 -- Stability   :  internal
13 -- Portability :  non-portable (GHC Extensions)
14 --
15 -- The 'Num' class and the 'Integer' type.
16 --
17 -----------------------------------------------------------------------------
18
19 -- #hide
20 module GHC.Num (module GHC.Num, module GHC.Integer) where
21
22 import GHC.Base
23 import GHC.Integer
24
25 infixl 7  *
26 infixl 6  +, -
27
28 default ()              -- Double isn't available yet,
29                         -- and we shouldn't be using defaults anyway
30 \end{code}
31
32 %*********************************************************
33 %*                                                      *
34 \subsection{Standard numeric class}
35 %*                                                      *
36 %*********************************************************
37
38 \begin{code}
39 -- | Basic numeric class.
40 --
41 -- Minimal complete definition: all except 'negate' or @(-)@
42 class  Num a  where
43     (+), (-), (*)       :: a -> a -> a
44     -- | Unary negation.
45     negate              :: a -> a
46     -- | Absolute value.
47     abs                 :: a -> a
48     -- | Sign of a number.
49     -- The functions 'abs' and 'signum' should satisfy the law:
50     --
51     -- > abs x * signum x == x
52     --
53     -- For real numbers, the 'signum' is either @-1@ (negative), @0@ (zero)
54     -- or @1@ (positive).
55     signum              :: a -> a
56     -- | Conversion from an 'Integer'.
57     -- An integer literal represents the application of the function
58     -- 'fromInteger' to the appropriate value of type 'Integer',
59     -- so such literals have type @('Num' a) => a@.
60     fromInteger         :: Integer -> a
61
62     {-# INLINE (-) #-}
63     {-# INLINE negate #-}
64     x - y               = x + negate y
65     negate x            = 0 - x
66
67 -- | the same as @'flip' ('-')@.
68 --
69 -- Because @-@ is treated specially in the Haskell grammar,
70 -- @(-@ /e/@)@ is not a section, but an application of prefix negation.
71 -- However, @('subtract'@ /exp/@)@ is equivalent to the disallowed section.
72 {-# INLINE subtract #-}
73 subtract :: (Num a) => a -> a -> a
74 subtract x y = y - x
75 \end{code}
76
77
78 %*********************************************************
79 %*                                                      *
80 \subsection{Instances for @Int@}
81 %*                                                      *
82 %*********************************************************
83
84 \begin{code}
85 instance  Num Int  where
86     (+)    = plusInt
87     (-)    = minusInt
88     negate = negateInt
89     (*)    = timesInt
90     abs n  = if n `geInt` 0 then n else negateInt n
91
92     signum n | n `ltInt` 0 = negateInt 1
93              | n `eqInt` 0 = 0
94              | otherwise   = 1
95
96     {-# INLINE fromInteger #-}   -- Just to be sure!
97     fromInteger i = I# (integerToInt i)
98 \end{code}
99
100 %*********************************************************
101 %*                                                      *
102 \subsection{The @Integer@ instances for @Num@}
103 %*                                                      *
104 %*********************************************************
105
106 \begin{code}
107 instance  Num Integer  where
108     (+) = plusInteger
109     (-) = minusInteger
110     (*) = timesInteger
111     negate         = negateInteger
112     fromInteger x  =  x
113
114     abs = absInteger
115     signum = signumInteger
116 \end{code}
117