[project @ 1999-07-14 08:37:57 by simonmar]
[ghc-hetmet.git] / ghc / lib / std / Prelude.lhs
1 We add the option -fno-implicit-prelude here to tell the reader that
2 special names such as () and -> shouldn't be resolved to Prelude.()
3 and Prelude.-> (as they are normally). -- SDM 8/10/97
4
5 \begin{code}
6 {-# OPTIONS -fno-implicit-prelude #-}
7
8 module Prelude (
9
10         -- Everything corresponding to the Report's PreludeList
11     module PrelList, 
12     lines, words, unlines, unwords,
13     sum, product,
14
15         -- Everything corresponding to the Report's PreludeText
16     ReadS, ShowS,
17     Read(readsPrec, readList),
18     Show(showsPrec, showList, show),
19     reads, shows, read, lex, 
20     showChar, showString, readParen, showParen,
21     
22         -- Everything corresponding to the Report's PreludeIO
23     FilePath, IOError,
24     ioError, userError, catch,
25     putChar, putStr, putStrLn, print,
26     getChar, getLine, getContents, interact,
27     readFile, writeFile, appendFile, readIO, readLn,
28
29     Bool(..),
30     Maybe(..),
31     Either(..),
32     Ordering(..), 
33     Char, String, Int, Integer, Float, Double, IO,
34     Rational,
35     []((:), []),
36     
37     module PrelTup,
38         -- Includes tuple types + fst, snd, curry, uncurry
39     ()(..),             -- The unit type
40     (->),               -- functions
41     
42     Eq(..),
43     Ord(..), 
44     Enum(..),
45     Bounded(..), 
46     Num((+), (-), (*), negate, abs, signum, fromInteger, fromInt{-glaExt-}),
47     Real(..),
48     Integral(quot, rem, div, mod, quotRem, divMod, toInteger, toInt{-partain-}),
49     Fractional(..),
50     Floating(..),
51     RealFrac(..),
52     RealFloat(..),
53
54         -- From Monad
55     Monad(..),
56     Functor(..), 
57     mapM, mapM_, sequence, sequence_, (=<<),
58
59     maybe, either,
60     (&&), (||), not, otherwise,
61     subtract, even, odd, gcd, lcm, (^), (^^), 
62     fromIntegral, realToFrac,
63     --exported by PrelTup: fst, snd, curry, uncurry,
64     id, const, (.), flip, ($), until,
65     asTypeOf, error, undefined,
66     seq, ($!)
67
68   ) where
69
70 import PrelBase
71 import PrelList
72 #ifndef USE_REPORT_PRELUDE
73      hiding ( takeUInt_append )
74 #endif
75 import PrelRead
76 import PrelEnum
77 import PrelNum
78 import PrelNumExtra
79 import PrelTup
80 import PrelMaybe
81 import PrelShow
82 import PrelConc
83 import Monad
84 import Maybe
85 import PrelErr   ( error )
86 import IO
87
88 infixr 0 $!
89
90 ($!)    :: (a -> b) -> a -> b
91 f $! x  = x `seq` f x
92
93 -- It is expected that compilers will recognize this and insert error
94 -- messages which are more appropriate to the context in which undefined 
95 -- appears. 
96
97 undefined               :: a
98 undefined               =  error "Prelude.undefined"
99 \end{code}
100
101
102 List sum and product are defined here because PrelList is too far
103 down the compilation chain to "see" the Num class.
104
105 \begin{code}
106 -- sum and product compute the sum or product of a finite list of numbers.
107 {-# SPECIALISE sum     :: [Int] -> Int #-}
108 {-# SPECIALISE sum     :: [Integer] -> Integer #-}
109 {-# SPECIALISE product :: [Int] -> Int #-}
110 {-# SPECIALISE product :: [Integer] -> Integer #-}
111 sum, product            :: (Num a) => [a] -> a
112 #ifdef USE_REPORT_PRELUDE
113 sum                     =  foldl (+) 0  
114 product                 =  foldl (*) 1
115 #else
116 sum     l       = sum' l 0
117   where
118     sum' []     a = a
119     sum' (x:xs) a = sum' xs (a+x)
120 product l       = prod l 1
121   where
122     prod []     a = a
123     prod (x:xs) a = prod xs (a*x)
124 #endif
125 \end{code}