[project @ 1999-02-01 10:02:15 by sof]
[ghc-hetmet.git] / ghc / lib / std / PrelBase.lhs
index 092d4df..8ff06b7 100644 (file)
@@ -1,5 +1,5 @@
 %
-% (c) The GRASP/AQUA Project, Glasgow University, 1992-1996
+% (c) The GRAP/AQUA Project, Glasgow University, 1992-1996
 %
 \section[PrelBase]{Module @PrelBase@}
 
@@ -7,11 +7,13 @@
 \begin{code}
 {-# OPTIONS -fno-implicit-prelude #-}
 
-module PrelBase(
+module PrelBase
+       (
        module PrelBase,
        module PrelGHC          -- Re-export PrelGHC, to avoid lots of people 
                                -- having to import it explicitly
-  ) where
+  ) 
+       where
 
 import {-# SOURCE #-} PrelErr ( error )
 import PrelGHC
@@ -29,109 +31,9 @@ infixr 0  $
 \end{code}
 
 
-\begin{code}
-{-
-class Eval a
-data Bool = False | True
-data Int = I# Int#
-data Double    = D# Double#
-data  ()  =  ()  --easier to do explicitly: deriving (Eq, Ord, Enum, Show, Bounded)
-                -- (avoids weird-named functions, e.g., con2tag_()#
-
-data  Maybe a  =  Nothing | Just a     
-data Ordering = LT | EQ | GT    deriving( Eq )
-
-type  String = [Char]
-
-data Char = C# Char#   
-data [] a = [] | a : [a]  -- do explicitly: deriving (Eq, Ord)
-                         -- to avoid weird names like con2tag_[]#
-
-
--------------- Stage 2 -----------------------
-not True = False
-not False = True
-True  && x             =  x
-False && x             =  False
-otherwise = True
-
-maybe :: b -> (a -> b) -> Maybe a -> b
-maybe n f Nothing  = n
-maybe n f (Just x) = f x
-
--------------- Stage 3 -----------------------
-class  Eq a  where
-    (==), (/=)         :: a -> a -> Bool
-
-    x /= y             =  not (x == y)
-
--- f :: Eq a => a -> a -> Bool
-f x y = x == y
-
-g :: Eq a => a -> a -> Bool
-g x y =  f x y 
-
--------------- Stage 4 -----------------------
-
-class  (Eq a) => Ord a  where
-    compare             :: a -> a -> Ordering
-    (<), (<=), (>=), (>):: a -> a -> Bool
-    max, min           :: a -> a -> a
-
--- An instance of Ord should define either compare or <=
--- Using compare can be more efficient for complex types.
-    compare x y
-           | x == y    = EQ
-           | x <= y    = LT
-           | otherwise = GT
-
-    x <= y  = compare x y /= GT
-    x <         y  = compare x y == LT
-    x >= y  = compare x y /= LT
-    x >         y  = compare x y == GT
-    max x y = case (compare x y) of { LT -> y ; EQ -> x ; GT -> x }
-    min x y = case (compare x y) of { LT -> x ; EQ -> x ; GT -> y }
-
-eqInt  (I# x) (I# y) = x ==# y
-
-instance Eq Int where
-    (==) x y = x `eqInt` y
-
-instance Ord Int where
-    compare x y = error "help"
-  
-class  Bounded a  where
-    minBound, maxBound :: a
-
-
-type  ShowS     = String -> String
-
-class  Show a  where
-    showsPrec :: Bool -> a -> ShowS
-    showList  :: [a] -> ShowS
-
-    showList ls = showList__ (showsPrec True) ls 
-
-showList__ :: (a -> ShowS) ->  [a] -> ShowS
-showList__ showx []     = showString "[]"
-
-showString      :: String -> ShowS
-showString      =  (++)
-
-[] ++ [] = []
-
-shows           :: (Show a) => a -> ShowS
-shows           =  showsPrec True
-
--- show            :: (Show a) => a -> String
---show x          =  shows x ""
--}
-\end{code}
-
-
 %*********************************************************
 %*                                                     *
-\subsection{Standard classes @Eq@, @Ord@, @Bounded@, @Eval@}
+\subsection{Standard classes @Eq@, @Ord@, @Bounded@
 %*                                                     *
 %*********************************************************
 
@@ -140,6 +42,7 @@ class  Eq a  where
     (==), (/=)         :: a -> a -> Bool
 
     x /= y             =  not (x == y)
+    x == y             = not  (x /= y)
 
 class  (Eq a) => Ord a  where
     compare             :: a -> a -> Ordering
@@ -162,32 +65,27 @@ class  (Eq a) => Ord a  where
 
 class  Bounded a  where
     minBound, maxBound :: a
-
-class Eval a
 \end{code}
 
 %*********************************************************
 %*                                                     *
-\subsection{Monadic classes @Functor@, @Monad@, @MonadZero@, @MonadPlus@}
+\subsection{Monadic classes @Functor@, @Monad@ }
 %*                                                     *
 %*********************************************************
 
 \begin{code}
 class  Functor f  where
-    map         :: (a -> b) -> f a -> f b
+    fmap         :: (a -> b) -> f a -> f b
 
 class  Monad m  where
     (>>=)       :: m a -> (a -> m b) -> m b
     (>>)        :: m a -> m b -> m b
     return      :: a -> m a
+    fail       :: String -> m a
 
     m >> k      =  m >>= \_ -> k
+    fail s      = error s
 
-class  (Monad m) => MonadZero m  where
-    zero        :: m a
-
-class  (MonadZero m) => MonadPlus m where
-   (++)         :: m a -> m a -> m a
 \end{code}
 
 
@@ -199,6 +97,7 @@ class  (MonadZero m) => MonadPlus m where
 
 \begin{code}
 class  Enum a  where
+    succ, pred         :: a -> a
     toEnum              :: Int -> a
     fromEnum            :: a -> Int
     enumFrom           :: a -> [a]             -- [n..]
@@ -206,35 +105,37 @@ class  Enum a     where
     enumFromTo         :: a -> a -> [a]        -- [n..m]
     enumFromThenTo     :: a -> a -> a -> [a]   -- [n,n'..m]
 
+    succ               = toEnum . (+1) . fromEnum
+    pred               = toEnum . (+(-1)) . fromEnum
     enumFromTo n m      =  map toEnum [fromEnum n .. fromEnum m]
     enumFromThenTo n n' m
                         =  map toEnum [fromEnum n, fromEnum n' .. fromEnum m]
 
-class  (Eq a, Show a, Eval a) => Num a  where
+class  (Eq a, Show a) => Num a  where
     (+), (-), (*)      :: a -> a -> a
     negate             :: a -> a
     abs, signum                :: a -> a
     fromInteger                :: Integer -> a
     fromInt            :: Int -> a -- partain: Glasgow extension
 
-    x - y              =  x + negate y
-    fromInt (I# i#)    = fromInteger (int2Integer# i#)
+    x - y              = x + negate y
+    negate x           = 0 - x
+    fromInt (I# i#)    = fromInteger (case int2Integer# i# of 
+                                         (# a, s, d #) -> J# a s d)
                                        -- Go via the standard class-op if the
                                        -- non-standard one ain't provided
 \end{code}
 
 \begin{code}
-succ, pred              :: Enum a => a -> a
-succ                    =  toEnum . (+1) . fromEnum
-pred                    =  toEnum . (subtract 1) . fromEnum
-
-chr = (toEnum   :: Int  -> Char)
-ord = (fromEnum :: Char -> Int)
+chr :: Int -> Char
+chr = toEnum
+ord :: Char -> Int
+ord = fromEnum
 
 ord_0 :: Num a => a
 ord_0 = fromInt (ord '0')
 
-{-# GENERATE_SPECS subtract a{Int} #-}
+{-# SPECIALISE subtract :: Int -> Int -> Int #-}
 subtract       :: (Num a) => a -> a -> a
 subtract x y   =  y - x
 \end{code}
@@ -251,9 +152,12 @@ type  ShowS     = String -> String
 
 class  Show a  where
     showsPrec :: Int -> a -> ShowS
+    show      :: a   -> String
     showList  :: [a] -> ShowS
 
-    showList ls = showList__ (showsPrec 0) ls 
+    showList ls     = showList__ (showsPrec 0) ls 
+    showsPrec _ x s = show x ++ s
+    show x          = showsPrec 0 x ""
 \end{code}
 
 %*********************************************************
@@ -266,10 +170,13 @@ class  Show a  where
 data [] a = [] | a : [a]  -- do explicitly: deriving (Eq, Ord)
                          -- to avoid weird names like con2tag_[]#
 
+
+
 instance (Eq a) => Eq [a]  where
     []     == []     = True    
     (x:xs) == (y:ys) = x == y && xs == ys
-    xs     == ys     = False                   
+    _xs    == _ys    = False                   
+
     xs     /= ys     = if (xs == ys) then False else True
 
 instance (Ord a) => Ord [a] where
@@ -282,35 +189,32 @@ instance (Ord a) => Ord [a] where
     min a b = case compare a b of { LT -> a; EQ -> a;  GT -> b }
 
     compare []     []     = EQ
-    compare (x:xs) []     = GT
-    compare []     (y:ys) = LT
+    compare (_:_)  []     = GT
+    compare []     (_:_)  = LT
     compare (x:xs) (y:ys) = case compare x y of
                                  LT -> LT      
                                 GT -> GT               
                                 EQ -> compare xs ys
 
+map :: (a -> b) -> [a] -> [b]
+map _ []     = []
+map f (x:xs) = f x : map f xs
+
+(++) :: [a] -> [a] -> [a]
+[]     ++ ys = ys
+(x:xs) ++ ys = x : (xs ++ ys)
+
 instance Functor [] where
-    map f []             =  []
-    map f (x:xs)         =  f x : map f xs
+    fmap = map
 
 instance  Monad []  where
     m >>= k             = foldr ((++) . k) [] m
     m >> k              = foldr ((++) . (\ _ -> k)) [] m
     return x            = [x]
-
-instance  MonadZero []  where
-    zero                = []
-
-instance  MonadPlus []  where
-#ifdef USE_REPORT_PRELUDE
-    xs ++ ys            =  foldr (:) ys xs
-#else
-    [] ++ ys            =  ys
-    (x:xs) ++ ys        =  x : (xs ++ ys)
-#endif
+    fail _             = []
 
 instance  (Show a) => Show [a]  where
-    showsPrec p         = showList
+    showsPrec _         = showList
     showList  ls       = showList__ (showsPrec 0) ls
 \end{code}
 
@@ -321,7 +225,7 @@ The rest of the prelude list functions are in PrelList.
 
 \begin{code}
 foldr                   :: (a -> b -> b) -> b -> [a] -> b
-foldr f z []            =  z
+foldr _ z []            =  z
 foldr f z (x:xs)        =  f x (foldr f z xs)
 
 -- takeWhile, applied to a predicate p and a list xs, returns the longest
@@ -330,13 +234,13 @@ foldr f z (x:xs)        =  f x (foldr f z xs)
 -- (takeWhile p xs, dropWhile p xs), while break p uses the negation of p.
 
 takeWhile               :: (a -> Bool) -> [a] -> [a]
-takeWhile p []          =  []
+takeWhile _ []          =  []
 takeWhile p (x:xs) 
             | p x       =  x : takeWhile p xs
             | otherwise =  []
 
 dropWhile               :: (a -> Bool) -> [a] -> [a]
-dropWhile p []          =  []
+dropWhile _ []          =  []
 dropWhile p xs@(x:xs')
             | p x       =  dropWhile p xs'
             | otherwise =  xs
@@ -346,44 +250,26 @@ dropWhile p xs@(x:xs')
 #ifdef USE_REPORT_PRELUDE
 (x:_)  !! 0             =  x
 (_:xs) !! n | n > 0     =  xs !! (n-1)
-(_:_)  !! _             =  error "PreludeList.!!: negative index"
-[]     !! _             =  error "PreludeList.!!: index too large"
+(_:_)  !! _             =  error "Prelude.(!!): negative index"
+[]     !! _             =  error "Prelude.(!!): index too large"
 #else
 -- HBC version (stolen), then unboxified
 -- The semantics is not quite the same for error conditions
 -- in the more efficient version.
 --
-_      !! n | n < 0  =  error "(!!){PreludeList}: negative index\n"
+_      !! n | n < 0  =  error "Prelude.(!!): negative index\n"
 xs     !! n          =  sub xs (case n of { I# n# -> n# })
                            where sub :: [a] -> Int# -> a
-                                 sub []      _ = error "(!!){PreludeList}: index too large\n"
-                                 sub (x:xs) n# = if n# ==# 0#
-                                                then x
-                                                else sub xs (n# -# 1#)
+                                 sub []      _ = error "Prelude.(!!): index too large\n"
+                                 sub (y:ys) n# = if n# ==# 0#
+                                                then y
+                                                else sub ys (n# -# 1#)
 #endif
 \end{code}
 
 
 %*********************************************************
 %*                                                     *
-\subsection{Type @Void@}
-%*                                                     *
-%*********************************************************
-
-The type @Void@ is built in, but it needs a @Show@ instance.
-
-\begin{code}
-void :: Void
-void = error "You tried to evaluate void"
-
-instance  Show Void  where
-    showsPrec p f  =  showString "<<void>>"
-    showList ls    = showList__ (showsPrec 0) ls
-\end{code}
-
-
-%*********************************************************
-%*                                                     *
 \subsection{Type @Bool@}
 %*                                                     *
 %*********************************************************
@@ -395,8 +281,8 @@ data  Bool  =  False | True deriving (Eq, Ord, Enum, Bounded, Show {- Read -})
 
 (&&), (||)             :: Bool -> Bool -> Bool
 True  && x             =  x
-False && x             =  False
-True  || x             =  True
+False && _             =  False
+True  || _             =  True
 False || x             =  x
 
 not                    :: Bool -> Bool
@@ -439,8 +325,10 @@ instance Ord () where
     compare () () = EQ
 
 instance Enum () where
+    succ x      = error "Prelude.Enum.succ{()}: not possible"
+    pred x      = error "Prelude.Enum.pred{()}: not possible"
     toEnum 0    = ()
-    toEnum _   = error "Prelude.Enum.().toEnum: argument not 0"
+    toEnum _   = error "Prelude.Enum.toEnum{()}: argument not 0"
     fromEnum () = 0
     enumFrom ()        = [()]
     enumFromThen () ()         = [()]
@@ -448,7 +336,7 @@ instance Enum () where
     enumFromThenTo () () () = [()]
 
 instance  Show ()  where
-    showsPrec p () = showString "()"
+    showsPrec _ () = showString "()"
     showList ls    = showList__ (showsPrec 0) ls
 \end{code}
 
@@ -459,7 +347,7 @@ instance  Show ()  where
 %*********************************************************
 
 \begin{code}
-data Ordering = LT | EQ | GT   deriving (Eq, Ord, Enum, Bounded, Show {- Read -})
+data Ordering = LT | EQ | GT   deriving (Eq, Ord, Enum, Bounded, Show {- in PrelRead: Read -})
 \end{code}
 
 
@@ -475,12 +363,21 @@ type  String = [Char]
 data Char = C# Char#   deriving (Eq, Ord)
 
 instance  Enum Char  where
+    succ     c@(C# c#)
+       | not (ord# c# ==# 255#) = C# (chr# (ord# c# +# 1#))
+       | otherwise             = error ("Prelude.Enum.succ{Char}: tried to take `succ' of maxBound")
+    pred     c@(C# c#)
+       | not (ord# c# ==# 0#)   = C# (chr# (ord# c# -# 1#))
+       | otherwise             = error ("Prelude.Enum.pred{Char}: tried to to take `pred' of minBound")
+
     toEnum   (I# i) | i >=# 0# && i <=# 255# =  C# (chr# i)
-                   | otherwise = error ("Prelude.Enum.Char.toEnum:out of range: " ++ show (I# i))
-    fromEnum (C# c)             =  I# (ord# c)
+                   | otherwise = error ("Prelude.Enum.toEnum{Char}: out of range: " ++ show (I# i))
+    fromEnum (C# c) =  I# (ord# c)
 
-    enumFrom   (C# c)         =  efttCh (ord# c)  1#   (># 255#)
-    enumFromTo (C# c1) (C# c2) = efttCh (ord# c1) 1#  (># (ord# c2))
+    enumFrom   (C# c)         = efttCh (ord# c)  1#   (># 255#)
+    enumFromTo (C# c1) (C# c2) 
+        | c1 `leChar#` c2 = efttCh (ord# c1) 1#               (># (ord# c2))
+        | otherwise       = []
 
     enumFromThen (C# c1) (C# c2)
        | c1 `leChar#` c2 = efttCh (ord# c1) (ord# c2 -# ord# c1) (># 255#)
@@ -491,27 +388,27 @@ instance  Enum Char  where
        | otherwise       = efttCh (ord# c1) (ord# c2 -# ord# c1) (<# (ord# c3))
 
 efttCh :: Int# -> Int# -> (Int# -> Bool) -> [Char]
-efttCh now step done 
-  = go now
+efttCh init step done 
+  = go init
   where
     go now | done now  = []
           | otherwise = C# (chr# now) : go (now +# step)
 
 instance  Show Char  where
-    showsPrec p '\'' = showString "'\\''"
-    showsPrec p c    = showChar '\'' . showLitChar c . showChar '\''
+    showsPrec _ '\'' = showString "'\\''"
+    showsPrec _ c    = showChar '\'' . showLitChar c . showChar '\''
 
     showList cs = showChar '"' . showl cs
                 where showl ""       = showChar '"'
-                      showl ('"':cs) = showString "\\\"" . showl cs
-                      showl (c:cs)   = showLitChar c . showl cs
+                      showl ('"':xs) = showString "\\\"" . showl xs
+                      showl (x:xs)   = showLitChar x . showl xs
 \end{code}
 
 
 \begin{code}
 isAscii, isLatin1, isControl, isPrint, isSpace, isUpper,
- isLower, isAlpha, isDigit, isOctDigit, isHexDigit, isAlphanum :: Char -> Bool
-isAscii c              =  fromEnum c < 128
+ isLower, isAlpha, isDigit, isOctDigit, isHexDigit, isAlphaNum :: Char -> Bool
+isAscii c              =  c <  '\x80'
 isLatin1 c              =  c <= '\xff'
 isControl c            =  c < ' ' || c >= '\DEL' && c <= '\x9f'
 isPrint c              =  not (isControl c)
@@ -537,24 +434,38 @@ isUpper c         =  c >= 'A' && c <= 'Z' ||
 isLower c              =  c >= 'a' && c <= 'z' ||
                            c >= '\xDF' && c <= '\xF6' ||
                            c >= '\xF8' && c <= '\xFF'
+isAsciiLower c          =  c >= 'a' && c <= 'z'
+isAsciiUpper c          =  c >= 'A' && c <= 'Z'
+
 isAlpha c              =  isLower c || isUpper c
 isDigit c              =  c >= '0' && c <= '9'
 isOctDigit c           =  c >= '0' && c <= '7'
 isHexDigit c           =  isDigit c || c >= 'A' && c <= 'F' ||
                                         c >= 'a' && c <= 'f'
-isAlphanum c           =  isAlpha c || isDigit c
+isAlphaNum c           =  isAlpha c || isDigit c
 
 -- Case-changing operations
 
 toUpper, toLower       :: Char -> Char
-toUpper c | isLower c  && c /= '\xDF' && c /= '\xFF'
- =  toEnum (fromEnum c - fromEnum 'a' + fromEnum 'A')
-  | otherwise  =  c
+toUpper c@(C# c#)
+  | isAsciiLower c    = C# (chr# (ord# c# -# 32#))
+  | isAscii c         = c
+    -- fall-through to the slower stuff.
+  | isLower c  && c /= '\xDF' && c /= '\xFF'
+  = toEnum (fromEnum c - fromEnum 'a' + fromEnum 'A')
+  | otherwise
+  = c
 
-toLower c | isUpper c  =  toEnum (fromEnum c - fromEnum 'A' 
+
+
+toLower c@(C# c#)
+  | isAsciiUpper c = C# (chr# (ord# c# +# 32#))
+  | isAscii c      = c
+  | isUpper c     =  toEnum (fromEnum c - fromEnum 'A' 
                                               + fromEnum 'a')
-         | otherwise   =  c
+  | otherwise     =  c
 
+asciiTab :: [String]
 asciiTab = -- Using an array drags in the array module.  listArray ('\NUL', ' ')
           ["NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK", "BEL",
            "BS",  "HT",  "LF",  "VT",  "FF",  "CR",  "SO",  "SI", 
@@ -586,22 +497,40 @@ instance Ord Int where
     max x y = case (compareInt x y) of { LT -> y ; EQ -> x ; GT -> x }
     min x y = case (compareInt x y) of { LT -> x ; EQ -> x ; GT -> y }
 
+compareInt :: Int -> Int -> Ordering
 (I# x) `compareInt` (I# y) | x <# y    = LT
                           | x ==# y   = EQ
                           | otherwise = GT
 
+instance  Bounded Int where
+    minBound =  -2147483648            -- GHC <= 2.09 had this at -2147483647
+    maxBound =   2147483647
+
 instance  Enum Int  where
+    succ x  
+       | x == maxBound  = error "Prelude.Enum.succ{Int}: tried to take `succ' of maxBound"
+       | otherwise      = x+1
+    pred x
+       | x == minBound  = error "Prelude.Enum.pred{Int}: tried to take `pred' of minBound"
+       | otherwise      = x-1
+
     toEnum   x = x
     fromEnum x = x
 
 #ifndef USE_FOLDR_BUILD
-    enumFrom     (I# c)                 = eftInt c  1#
-    enumFromTo   (I# c1) (I# c2) = efttInt c1 1#  (># c2)
-    enumFromThen (I# c1) (I# c2) = eftInt c1 (c2 -# c1)
+    enumFrom     (I# c)        = efttInt True c 1# (\ _ -> False)
+
+    enumFromTo   (I# c1) (I# c2) 
+        | c1 <=# c2 = efttInt True  c1 1#              (># c2)
+       | otherwise = []
+
+    enumFromThen (I# c1) (I# c2) 
+        | c1 <# c2  = efttInt True  c1 (c2 -# c1) (\ _ -> False)
+       | otherwise = efttInt False c1 (c2 -# c1) (\ _ -> False)
 
     enumFromThenTo (I# c1) (I# c2) (I# c3)
-       | c1 <=# c2 = efttInt c1 (c2 -# c1) (># c3)
-       | otherwise = efttInt c1 (c2 -# c1) (<# c3)
+       | c1 <=# c2 = efttInt True  c1 (c2 -# c1) (># c3)
+       | otherwise = efttInt False c1 (c2 -# c1) (<# c3)
 
 #else
     {-# INLINE enumFrom #-}
@@ -612,19 +541,16 @@ instance  Enum Int  where
        let g x = if x <= y then x `c` g (x `plusInt` 1) else n in g x)
 #endif
 
-efttInt :: Int# -> Int# -> (Int# -> Bool) -> [Int]
-efttInt now step done
-  = go now
-  where
-    go now | done now  = []
-          | otherwise = I# now : go (now +# step)
-
-eftInt :: Int# -> Int# -> [Int]
-eftInt now step
-  = go now
+efttInt :: Bool -> Int# -> Int# -> (Int# -> Bool) -> [Int]
+efttInt increasing init step done = go init
   where
-    go now = I# now : go (now +# step)
-
+    go now 
+     | done now                     = []    
+     | increasing     && now ># nxt = [I# now] -- overflowed
+     | not increasing && now <# nxt = [I# now] -- underflowed
+     | otherwise                   = I# now : go nxt
+     where
+      nxt = now +# step
 
 instance  Num Int  where
     (+)           x y =  plusInt x y
@@ -654,16 +580,19 @@ instance  Show Int  where
 %*                                                     *
 %*********************************************************
 
-Just the type declarations.  If we don't actually use any @Integers@ we'd
-rather not link the @Integer@ module at all; and the default-decl stuff
-in the renamer tends to slurp in @Double@ regardless.
-
 \begin{code}
 data Float     = F# Float#
 data Double    = D# Double#
 data Integer   = J# Int# Int# ByteArray#
-\end{code}
 
+instance  Eq Integer  where
+    (J# a1 s1 d1) == (J# a2 s2 d2)
+      = (cmpInteger# a1 s1 d1 a2 s2 d2) ==# 0#
+
+    (J# a1 s1 d1) /= (J# a2 s2 d2)
+      = (cmpInteger# a1 s1 d1 a2 s2 d2) /=# 0#
+
+\end{code}
 
 %*********************************************************
 %*                                                     *
@@ -672,10 +601,8 @@ data Integer       = J# Int# Int# ByteArray#
 %*********************************************************
 
 \begin{code}
-instance Eval (a -> b) 
-
 instance  Show (a -> b)  where
-    showsPrec p f  =  showString "<<function>>"
+    showsPrec _ _  =  showString "<<function>>"
     showList ls           = showList__ (showsPrec 0) ls
 
 
@@ -689,7 +616,6 @@ const x _           =  x
 
 -- function composition
 {-# INLINE (.) #-}
-{- GENERATE_SPECS (.) a b c -}
 (.)      :: (b -> c) -> (a -> b) -> a -> c
 (.) f g        x = f (g x)
 
@@ -714,22 +640,6 @@ asTypeOf           :: a -> a -> a
 asTypeOf               =  const
 \end{code}
 
-
-%*********************************************************
-%*                                                     *
-\subsection{Miscellaneous}
-%*                                                     *
-%*********************************************************
-
-
-\begin{code}
-data Lift a = Lift a
-{- GENERATE_SPECS data a :: Lift a -}
-\end{code}
-
-
-
-
 %*********************************************************
 %*                                                     *
 \subsection{Support code for @Show@}
@@ -740,9 +650,6 @@ data Lift a = Lift a
 shows           :: (Show a) => a -> ShowS
 shows           =  showsPrec 0
 
-show            :: (Show a) => a -> String
-show x          =  shows x ""
-
 showChar        :: Char -> ShowS
 showChar        =  (:)
 
@@ -752,14 +659,13 @@ showString      =  (++)
 showParen       :: Bool -> ShowS -> ShowS
 showParen b p   =  if b then showChar '(' . p . showChar ')' else p
 
-{- GENERATE_SPECS showList__ a -}
 showList__ :: (a -> ShowS) ->  [a] -> ShowS
 
-showList__ showx []     = showString "[]"
+showList__ _ []         = showString "[]"
 showList__ showx (x:xs) = showChar '[' . showx x . showl xs
   where
     showl []     = showChar ']'
-    showl (x:xs) = showChar ',' . showx x . showl xs
+    showl (y:ys) = showChar ',' . showx y . showl ys
 
 showSpace :: ShowS
 showSpace = {-showChar ' '-} \ xs -> ' ' : xs
@@ -783,6 +689,7 @@ showLitChar '\v'       =  showString "\\v"
 showLitChar '\SO'         =  protectEsc (== 'H') (showString "\\SO")
 showLitChar c             =  showString ('\\' : asciiTab!!ord c)
 
+protectEsc :: (Char -> Bool) -> ShowS -> ShowS
 protectEsc p f            = f . cont
                             where cont s@(c:_) | p c = "\\&" ++ s
                                   cont s             = s
@@ -790,8 +697,8 @@ protectEsc p f                 = f . cont
 intToDigit :: Int -> Char
 intToDigit i
  | i >= 0  && i <=  9   =  toEnum (fromEnum '0' + i)
- | i >= 10 && i <= 15   =  toEnum (fromEnum 'a' + i -10)
- | otherwise           =  error ("Char.intToDigit: not a digit" ++ show i)
+ | i >= 10 && i <= 15   =  toEnum (fromEnum 'a' + i - 10)
+ | otherwise           =  error ("Char.intToDigit: not a digit " ++ show i)
 
 \end{code}
 
@@ -800,26 +707,21 @@ Code specific for Ints.
 \begin{code}
 showSignedInt :: Int -> Int -> ShowS
 showSignedInt p (I# n) r
-  = -- from HBC version; support code follows
-    if n <# 0# && p > 6 then '(':itos n++(')':r) else itos n ++ r
-
-itos :: Int# -> String
-itos n =
-    if n <# 0# then
-       if negateInt# n <# 0# then
-           -- n is minInt, a difficult number
-           itos (n `quotInt#` 10#) ++ itos' (negateInt# (n `remInt#` 10#)) []
-       else
-           '-':itos' (negateInt# n) []
-    else 
-       itos' n []
-  where
-    itos' :: Int# -> String -> String
-    itos' n cs = 
-       if n <# 10# then
-           C# (chr# (n +# ord# '0'#)) : cs
-       else 
-           itos' (n `quotInt#` 10#) (C# (chr# (n `remInt#` 10# +# ord# '0'#)) : cs)
+  | n <# 0# && p > 6 = '(':itos n (')':r)
+  | otherwise       = itos n r
+
+itos :: Int# -> String -> String
+itos n r
+  | n >=# 0#           = itos' n r
+  | negateInt# n <# 0#  = -- n is minInt, a difficult number
+           itos (n `quotInt#` 10#) (itos' (negateInt# (n `remInt#` 10#)) r)
+  | otherwise = '-':itos' (negateInt# n) r
+ where
+   itos' :: Int# -> String -> String
+   itos' x cs 
+     | x <# 10#  = C# (chr# (x +# ord# '0'#)) : cs
+     | otherwise = itos' (x `quotInt#` 10#) 
+                        (C# (chr# (x `remInt#` 10# +# ord# '0'#)) : cs)
 \end{code}
 
 %*********************************************************
@@ -835,12 +737,17 @@ used in the case of partial applications, etc.
 {-# INLINE eqInt #-}
 {-# INLINE neInt #-}
 
+plusInt, minusInt, timesInt, quotInt, remInt :: Int -> Int -> Int
 plusInt        (I# x) (I# y) = I# (x +# y)
 minusInt(I# x) (I# y) = I# (x -# y)
 timesInt(I# x) (I# y) = I# (x *# y)
 quotInt        (I# x) (I# y) = I# (quotInt# x y)
 remInt (I# x) (I# y) = I# (remInt# x y)
+
+negateInt :: Int -> Int
 negateInt (I# x)      = I# (negateInt# x)
+
+gtInt, geInt, eqInt, neInt, ltInt, leInt :: Int -> Int -> Bool
 gtInt  (I# x) (I# y) = x ># y
 geInt  (I# x) (I# y) = x >=# y
 eqInt  (I# x) (I# y) = x ==# y
@@ -848,3 +755,21 @@ neInt      (I# x) (I# y) = x /=# y
 ltInt  (I# x) (I# y) = x <# y
 leInt  (I# x) (I# y) = x <=# y
 \end{code}
+
+Convenient boxed Integer PrimOps.  These are 'thin-air' Ids, so
+it's nice to have them in PrelBase.
+
+\begin{code}
+{-# INLINE int2Integer #-}
+{-# INLINE addr2Integer #-}
+int2Integer :: Int# -> Integer
+int2Integer  i = case int2Integer#  i of (# a, s, d #) -> J# a s d
+addr2Integer :: Addr# -> Integer
+addr2Integer x = case addr2Integer# x of (# a, s, d #) -> J# a s d
+
+integer_0, integer_1, integer_2, integer_m1 :: Integer
+integer_0  = int2Integer 0#
+integer_1  = int2Integer 1#
+integer_2  = int2Integer 2#
+integer_m1 = int2Integer (negateInt# 1#)
+\end{code}