1 % -----------------------------------------------------------------------------
2 % $Id: PrelBase.lhs,v 1.33 2000/07/07 11:03:57 simonmar Exp $
4 % (c) The University of Glasgow, 1992-2000
6 \section[PrelBase]{Module @PrelBase@}
9 The overall structure of the GHC Prelude is a bit tricky.
11 a) We want to avoid "orphan modules", i.e. ones with instance
12 decls that don't belong either to a tycon or a class
13 defined in the same module
15 b) We want to avoid giant modules
17 So the rough structure is as follows, in (linearised) dependency order
20 PrelGHC Has no implementation. It defines built-in things, and
21 by importing it you bring them into scope.
22 The source file is PrelGHC.hi-boot, which is just
23 copied to make PrelGHC.hi
25 Classes: CCallable, CReturnable
27 PrelBase Classes: Eq, Ord, Functor, Monad
28 Types: list, (), Int, Bool, Ordering, Char, String
30 PrelTup Types: tuples, plus instances for PrelBase classes
32 PrelShow Class: Show, plus instances for PrelBase/PrelTup types
34 PrelEnum Class: Enum, plus instances for PrelBase/PrelTup types
36 PrelMaybe Type: Maybe, plus instances for PrelBase classes
38 PrelNum Class: Num, plus instances for Int
39 Type: Integer, plus instances for all classes so far (Eq, Ord, Num, Show)
41 Integer is needed here because it is mentioned in the signature
42 of 'fromInteger' in class Num
44 PrelReal Classes: Real, Integral, Fractional, RealFrac
45 plus instances for Int, Integer
46 Types: Ratio, Rational
47 plus intances for classes so far
49 Rational is needed here because it is mentioned in the signature
50 of 'toRational' in class Real
52 Ix Classes: Ix, plus instances for Int, Bool, Char, Integer, Ordering, tuples
54 PrelArr Types: Array, MutableArray, MutableVar
56 Does *not* contain any ByteArray stuff (see PrelByteArr)
57 Arrays are used by a function in PrelFloat
59 PrelFloat Classes: Floating, RealFloat
60 Types: Float, Double, plus instances of all classes so far
62 This module contains everything to do with floating point.
63 It is a big module (900 lines)
64 With a bit of luck, many modules can be compiled without ever reading PrelFloat.hi
66 PrelByteArr Types: ByteArray, MutableByteArray
68 We want this one to be after PrelFloat, because it defines arrays
72 Other Prelude modules are much easier with fewer complex dependencies.
76 {-# OPTIONS -fno-implicit-prelude #-}
81 module PrelGHC -- Re-export PrelGHC, to avoid lots of people
82 -- having to import it explicitly
90 infix 4 ==, /=, <, <=, >=, >
96 default () -- Double isn't available yet
100 %*********************************************************
102 \subsection{DEBUGGING STUFF}
103 %* (for use when compiling PrelBase itself doesn't work)
105 %*********************************************************
109 data Bool = False | True
110 data Ordering = LT | EQ | GT
118 (&&) True True = True
124 unpackCString# :: Addr# -> [Char]
125 unpackFoldrCString# :: Addr# -> (Char -> a -> a) -> a -> a
126 unpackAppendCString# :: Addr# -> [Char] -> [Char]
127 unpackNBytes# :: Addr# -> Int# -> [Char]
128 unpackNBytes# a b = error "urk"
129 unpackCString# a = error "urk"
130 unpackFoldrCString# a = error "urk"
131 unpackAppendCString# a = error "urk"
136 %*********************************************************
138 \subsection{Standard classes @Eq@, @Ord@}
140 %*********************************************************
144 (==), (/=) :: a -> a -> Bool
146 -- x /= y = not (x == y)
147 -- x == y = not (x /= y)
149 (/=) x y = not ((==) x y)
152 class (Eq a) => Ord a where
153 compare :: a -> a -> Ordering
154 (<), (<=), (>=), (>):: a -> a -> Bool
155 max, min :: a -> a -> a
157 -- An instance of Ord should define either compare or <=
158 -- Using compare can be more efficient for complex types.
161 | x <= y = LT -- NB: must be '<=' not '<' to validate the
162 -- above claim about the minimal things that can
163 -- be defined for an instance of Ord
166 x <= y = case compare x y of { GT -> False; _other -> True }
167 x < y = case compare x y of { LT -> True; _other -> False }
168 x >= y = case compare x y of { LT -> False; _other -> True }
169 x > y = case compare x y of { GT -> True; _other -> False }
171 -- These two default methods use '>' rather than compare
172 -- because the latter is often more expensive
173 max x y = if x > y then x else y
174 min x y = if x > y then y else x
177 %*********************************************************
179 \subsection{Monadic classes @Functor@, @Monad@ }
181 %*********************************************************
184 class Functor f where
185 fmap :: (a -> b) -> f a -> f b
188 (>>=) :: m a -> (a -> m b) -> m b
189 (>>) :: m a -> m b -> m b
191 fail :: String -> m a
193 m >> k = m >>= \_ -> k
199 %*********************************************************
201 \subsection{The list type}
203 %*********************************************************
206 data [] a = [] | a : [a] -- do explicitly: deriving (Eq, Ord)
207 -- to avoid weird names like con2tag_[]#
210 instance (Eq a) => Eq [a] where
212 {-# SPECIALISE instance Eq [Char] #-}
215 (x:xs) == (y:ys) = x == y && xs == ys
218 xs /= ys = if (xs == ys) then False else True
220 instance (Ord a) => Ord [a] where
222 {-# SPECIALISE instance Ord [Char] #-}
224 a < b = case compare a b of { LT -> True; EQ -> False; GT -> False }
225 a <= b = case compare a b of { LT -> True; EQ -> True; GT -> False }
226 a >= b = case compare a b of { LT -> False; EQ -> True; GT -> True }
227 a > b = case compare a b of { LT -> False; EQ -> False; GT -> True }
230 compare (_:_) [] = GT
231 compare [] (_:_) = LT
232 compare (x:xs) (y:ys) = case compare x y of
237 instance Functor [] where
240 instance Monad [] where
241 m >>= k = foldr ((++) . k) [] m
242 m >> k = foldr ((++) . (\ _ -> k)) [] m
247 A few list functions that appear here because they are used here.
248 The rest of the prelude list functions are in PrelList.
250 ----------------------------------------------
251 -- foldr/build/augment
252 ----------------------------------------------
255 foldr :: (a -> b -> b) -> b -> [a] -> b
257 -- foldr f z (x:xs) = f x (foldr f z xs)
262 go (x:xs) = x `k` go xs
264 build :: forall a. (forall b. (a -> b -> b) -> b -> b) -> [a]
265 {-# INLINE 2 build #-}
266 -- The INLINE is important, even though build is tiny,
267 -- because it prevents [] getting inlined in the version that
268 -- appears in the interface file. If [] *is* inlined, it
269 -- won't match with [] appearing in rules in an importing module.
271 -- The "2" says to inline in phase 2
275 augment :: forall a. (forall b. (a->b->b) -> b -> b) -> [a] -> [a]
276 {-# INLINE 2 augment #-}
277 augment g xs = g (:) xs
280 "fold/build" forall k z (g::forall b. (a->b->b) -> b -> b) .
281 foldr k z (build g) = g k z
283 "foldr/augment" forall k z xs (g::forall b. (a->b->b) -> b -> b) .
284 foldr k z (augment g xs) = g k (foldr k z xs)
286 "foldr/id" foldr (:) [] = \x->x
287 "foldr/app" forall xs ys. foldr (:) ys xs = append xs ys
289 "foldr/cons" forall k z x xs. foldr k z (x:xs) = k x (foldr k z xs)
290 "foldr/nil" forall k z. foldr k z [] = z
292 "augment/build" forall (g::forall b. (a->b->b) -> b -> b)
293 (h::forall b. (a->b->b) -> b -> b) .
294 augment g (build h) = build (\c n -> g c (h c n))
295 "augment/nil" forall (g::forall b. (a->b->b) -> b -> b) .
296 augment g [] = build g
299 -- This rule is true, but not (I think) useful:
300 -- augment g (augment h t) = augment (\cn -> g c (h c n)) t
304 ----------------------------------------------
306 ----------------------------------------------
309 map :: (a -> b) -> [a] -> [b]
313 mapFB c f x ys = c (f x) ys
315 mapList :: (a -> b) -> [a] -> [b]
317 mapList f (x:xs) = f x : mapList f xs
320 "map" forall f xs. map f xs = build (\c n -> foldr (mapFB c f) n xs)
321 "mapFB" forall c f g. mapFB (mapFB c f) g = mapFB c (f.g)
322 "mapList" forall f. foldr (mapFB (:) f) [] = mapList f
327 ----------------------------------------------
329 ----------------------------------------------
331 (++) :: [a] -> [a] -> [a]
335 "++" forall xs ys. (++) xs ys = augment (\c n -> foldr c n xs) ys
338 append :: [a] -> [a] -> [a]
340 append (x:xs) ys = x : append xs ys
344 %*********************************************************
346 \subsection{Type @Bool@}
348 %*********************************************************
351 data Bool = False | True deriving (Eq, Ord)
352 -- Read in PrelRead, Show in PrelShow
356 (&&), (||) :: Bool -> Bool -> Bool
371 %*********************************************************
373 \subsection{The @()@ type}
375 %*********************************************************
377 The Unit type is here because virtually any program needs it (whereas
378 some programs may get away without consulting PrelTup). Furthermore,
379 the renamer currently *always* asks for () to be in scope, so that
380 ccalls can use () as their default type; so when compiling PrelBase we
381 need (). (We could arrange suck in () only if -fglasgow-exts, but putting
382 it here seems more direct.)
391 instance Ord () where
402 %*********************************************************
404 \subsection{Type @Ordering@}
406 %*********************************************************
409 data Ordering = LT | EQ | GT deriving (Eq, Ord)
410 -- Read in PrelRead, Show in PrelShow
414 %*********************************************************
416 \subsection{Type @Char@ and @String@}
418 %*********************************************************
425 -- We don't use deriving for Eq and Ord, because for Ord the derived
426 -- instance defines only compare, which takes two primops. Then
427 -- '>' uses compare, and therefore takes two primops instead of one.
429 instance Eq Char where
430 (C# c1) == (C# c2) = c1 `eqChar#` c2
431 (C# c1) /= (C# c2) = c1 `neChar#` c2
433 instance Ord Char where
434 (C# c1) > (C# c2) = c1 `gtChar#` c2
435 (C# c1) >= (C# c2) = c1 `geChar#` c2
436 (C# c1) <= (C# c2) = c1 `leChar#` c2
437 (C# c1) < (C# c2) = c1 `ltChar#` c2
440 chr (I# i) | i >=# 0# && i <=# 255# = C# (chr# i)
441 | otherwise = error ("Prelude.chr: bad argument")
443 unsafeChr :: Int -> Char
444 unsafeChr (I# i) = C# (chr# i)
447 ord (C# c) = I# (ord# c)
451 %*********************************************************
453 \subsection{Type @Int@}
455 %*********************************************************
460 zeroInt, oneInt, twoInt, maxInt, minInt :: Int
464 minInt = I# (-2147483648#) -- GHC <= 2.09 had this at -2147483647
465 maxInt = I# 2147483647#
467 instance Eq Int where
468 (==) x y = x `eqInt` y
469 (/=) x y = x `neInt` y
471 instance Ord Int where
472 compare x y = compareInt x y
479 compareInt :: Int -> Int -> Ordering
480 (I# x) `compareInt` (I# y) | x <# y = LT
486 %*********************************************************
488 \subsection{The function type}
490 %*********************************************************
501 -- function composition
503 (.) :: (b -> c) -> (a -> b) -> a -> c
506 -- flip f takes its (first) two arguments in the reverse order of f.
507 flip :: (a -> b -> c) -> b -> a -> c
510 -- right-associating infix application operator (useful in continuation-
512 ($) :: (a -> b) -> a -> b
515 -- until p f yields the result of applying f until p holds.
516 until :: (a -> Bool) -> (a -> a) -> a -> a
517 until p f x | p x = x
518 | otherwise = until p f (f x)
520 -- asTypeOf is a type-restricted version of const. It is usually used
521 -- as an infix operator, and its typing forces its first argument
522 -- (which is usually overloaded) to have the same type as the second.
523 asTypeOf :: a -> a -> a
527 %*********************************************************
529 \subsection{CCallable instances}
531 %*********************************************************
533 Defined here to avoid orphans
536 instance CCallable Char
537 instance CReturnable Char
539 instance CCallable Int
540 instance CReturnable Int
542 instance CReturnable () -- Why, exactly?
546 %*********************************************************
548 \subsection{Numeric primops}
550 %*********************************************************
552 Definitions of the boxed PrimOps; these will be
553 used in the case of partial applications, etc.
562 {-# INLINE plusInt #-}
563 {-# INLINE minusInt #-}
564 {-# INLINE timesInt #-}
565 {-# INLINE quotInt #-}
566 {-# INLINE remInt #-}
567 {-# INLINE negateInt #-}
569 plusInt, minusInt, timesInt, quotInt, remInt, gcdInt :: Int -> Int -> Int
570 plusInt (I# x) (I# y) = I# (x +# y)
571 minusInt(I# x) (I# y) = I# (x -# y)
572 timesInt(I# x) (I# y) = I# (x *# y)
573 quotInt (I# x) (I# y) = I# (quotInt# x y)
574 remInt (I# x) (I# y) = I# (remInt# x y)
576 gcdInt (I# a) (I# b) = g a b
577 where g 0# 0# = error "PrelBase.gcdInt: gcd 0 0 is undefined"
580 g _ _ = I# (gcdInt# absA absB)
582 absInt x = if x <# 0# then negateInt# x else x
587 negateInt :: Int -> Int
588 negateInt (I# x) = I# (negateInt# x)
590 divInt, modInt :: Int -> Int -> Int
592 | x > zeroInt && y < zeroInt = quotInt ((x `minusInt` y) `minusInt` oneInt) y
593 | x < zeroInt && y > zeroInt = quotInt ((x `minusInt` y) `plusInt` oneInt) y
594 | otherwise = quotInt x y
597 | x > zeroInt && y < zeroInt ||
598 x < zeroInt && y > zeroInt = if r/=zeroInt then r `plusInt` y else zeroInt
603 gtInt, geInt, eqInt, neInt, ltInt, leInt :: Int -> Int -> Bool
604 gtInt (I# x) (I# y) = x ># y
605 geInt (I# x) (I# y) = x >=# y
606 eqInt (I# x) (I# y) = x ==# y
607 neInt (I# x) (I# y) = x /=# y
608 ltInt (I# x) (I# y) = x <# y
609 leInt (I# x) (I# y) = x <=# y
613 %********************************************************
615 \subsection{Unpacking C strings}
617 %********************************************************
619 This code is needed for virtually all programs, since it's used for
620 unpacking the strings of error messages.
623 unpackCString# :: Addr# -> [Char]
624 unpackCString# a = unpackCStringList# a
626 unpackCStringList# :: Addr# -> [Char]
627 unpackCStringList# addr
631 | ch `eqChar#` '\0'# = []
632 | otherwise = C# ch : unpack (nh +# 1#)
634 ch = indexCharOffAddr# addr nh
636 unpackAppendCString# :: Addr# -> [Char] -> [Char]
637 unpackAppendCString# addr rest
641 | ch `eqChar#` '\0'# = rest
642 | otherwise = C# ch : unpack (nh +# 1#)
644 ch = indexCharOffAddr# addr nh
646 unpackFoldrCString# :: Addr# -> (Char -> a -> a) -> a -> a
647 unpackFoldrCString# addr f z
651 | ch `eqChar#` '\0'# = z
652 | otherwise = C# ch `f` unpack (nh +# 1#)
654 ch = indexCharOffAddr# addr nh
656 unpackNBytes# :: Addr# -> Int# -> [Char]
657 -- This one is called by the compiler to unpack literal
658 -- strings with NULs in them; rare. It's strict!
659 -- We don't try to do list deforestation for this one
661 unpackNBytes# _addr 0# = []
662 unpackNBytes# addr len# = unpack [] (len# -# 1#)
667 case indexCharOffAddr# addr i# of
668 ch -> unpack (C# ch : acc) (i# -# 1#)
671 "unpack" forall a . unpackCString# a = build (unpackFoldrCString# a)
672 "unpack-list" forall a . unpackFoldrCString# a (:) [] = unpackCStringList# a
673 "unpack-append" forall a n . unpackFoldrCString# a (:) n = unpackAppendCString# a n
675 -- There's a built-in rule (in PrelRules.lhs) for
676 -- unpackFoldr "foo" c (unpackFoldr "baz" c n) = unpackFoldr "foobaz" c n