X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Flib%2Fstd%2FPrelude.lhs;h=116c466fc542e02ac23eb504ae278982aa5c8de1;hb=09c9b6a7d04d95595097fcfe2505b380e754bf00;hp=bf7cbd1257004eaafc29e136a9536b90818e4ebd;hpb=438596897ebbe25a07e1c82085cfbc5bdb00f09e;p=ghc-hetmet.git diff --git a/ghc/lib/std/Prelude.lhs b/ghc/lib/std/Prelude.lhs index bf7cbd1..116c466 100644 --- a/ghc/lib/std/Prelude.lhs +++ b/ghc/lib/std/Prelude.lhs @@ -1,3 +1,11 @@ +% ------------------------------------------------------------------------------ +% $Id: Prelude.lhs,v 1.25 2001/02/28 00:01:03 qrczak Exp $ +% +% (c) The University of Glasgow, 1992-2000 +% + +\section[Prelude]{Module @Prelude@} + We add the option -fno-implicit-prelude here to tell the reader that special names such as () and -> shouldn't be resolved to Prelude.() and Prelude.-> (as they are normally). -- SDM 8/10/97 @@ -7,83 +15,99 @@ and Prelude.-> (as they are normally). -- SDM 8/10/97 module Prelude ( - -- Everything from these modules - module PrelList, - module PrelTup, - - -- From PrelBase - (->), - Eq(..), - Ord(..), Ordering(..), - Bounded(..), - Enum(..), succ, pred, - Show(..), ShowS, shows, show, showChar, showString, showParen, - Eval(..), seq, strict, - Bool(..), (&&), (||), not, otherwise, - Char, String, Int, Integer, Float, Double, Void, - Maybe(..), maybe, - Either(..), either, - ()(..), -- The unit type - + -- Everything corresponding to the Report's PreludeList + module PrelList, + lines, words, unlines, unwords, + sum, product, + + -- Everything corresponding to the Report's PreludeText + ReadS, ShowS, + Read(readsPrec, readList), + Show(showsPrec, showList, show), + reads, shows, read, lex, + showChar, showString, readParen, showParen, - id, const, (.), flip, ($), until, asTypeOf, undefined, - - -- From Error - error, - - -- From Monad - Functor(..), Monad(..), MonadZero(..), MonadPlus(..), - accumulate, sequence, mapM, mapM_, guard, filter, concat, applyM, - - -- From PrelRead - ReadS, Read(readsPrec, readList), - reads, read, lex, readParen, - - -- From IO - IO, FilePath, IOError, - fail, userError, catch, + -- Everything corresponding to the Report's PreludeIO + FilePath, IOError, + ioError, userError, catch, putChar, putStr, putStrLn, print, getChar, getLine, getContents, interact, readFile, writeFile, appendFile, readIO, readLn, - -- From PrelNum - Ratio, Rational, - (%), numerator, denominator, approxRational, - - Num((+), (-), (*), negate, abs, signum, fromInteger, fromInt{-glaExt-}), - Real(toRational), - Integral(quot, rem, div, mod, quotRem, divMod, toInteger, toInt{-partain-}), - Fractional((/), recip, fromRational), - Floating(pi, exp, log, sqrt, (**), logBase, sin, cos, tan, - asin, acos, atan, sinh, cosh, tanh, asinh, acosh, atanh), - RealFrac(properFraction, truncate, round, ceiling, floor), - RealFloat(floatRadix, floatDigits, floatRange, decodeFloat, - encodeFloat, exponent, significand, scaleFloat, isNaN, - isInfinite, isDenormalized, isIEEE, isNegativeZero), + Bool(..), + Maybe(..), + Either(..), + Ordering(..), + Char, String, Int, Integer, Float, Double, IO, + Rational, + []((:), []), + + module PrelTup, + -- Includes tuple types + fst, snd, curry, uncurry + ()(..), -- The unit type + (->), -- functions + + Eq(..), + Ord(..), + Enum(..), + Bounded(..), + Num(..), + Real(..), + Integral(..), + Fractional(..), + Floating(..), + RealFrac(..), + RealFloat(..), + + -- Monad stuff, from PrelBase, and defined here + Monad(..), + Functor(..), + mapM, mapM_, sequence, sequence_, (=<<), + + maybe, either, + (&&), (||), not, otherwise, subtract, even, odd, gcd, lcm, (^), (^^), - fromIntegral, fromRealFrac, atan2 + fromIntegral, realToFrac, + --exported by PrelTup: fst, snd, curry, uncurry, + id, const, (.), flip, ($), until, + asTypeOf, error, undefined, + seq, ($!) + ) where import PrelBase import PrelList +#ifndef USE_REPORT_PRELUDE + hiding ( takeUInt_append ) +#endif +import PrelIO +import PrelIOBase +import PrelException import PrelRead +import PrelEnum import PrelNum -import PrelNumExtra +import PrelReal +import PrelFloat import PrelTup import PrelMaybe -import PrelEither -import PrelBounded +import PrelShow import PrelConc -import Monad -import Maybe import PrelErr ( error ) -import IO --- These can't conveniently be defined in PrelBase because they use numbers, --- or I/O, so here's a convenient place to do them. +infixr 1 =<< +infixr 0 $! +\end{code} + -strict :: (a -> b) -> a -> b -strict f x = x `seq` f x +%********************************************************* +%* * +\subsection{Miscellaneous functions} +%* * +%********************************************************* + +\begin{code} +($!) :: (a -> b) -> a -> b +f $! x = x `seq` f x -- It is expected that compilers will recognize this and insert error -- messages which are more appropriate to the context in which undefined @@ -94,4 +118,64 @@ undefined = error "Prelude.undefined" \end{code} +%********************************************************* +%* * +\subsection{List sum and product} +%* * +%********************************************************* + +List sum and product are defined here because PrelList is too far +down the compilation chain to "see" the Num class. + +\begin{code} +-- sum and product compute the sum or product of a finite list of numbers. +{-# SPECIALISE sum :: [Int] -> Int #-} +{-# SPECIALISE sum :: [Integer] -> Integer #-} +{-# SPECIALISE product :: [Int] -> Int #-} +{-# SPECIALISE product :: [Integer] -> Integer #-} +sum, product :: (Num a) => [a] -> a +#ifdef USE_REPORT_PRELUDE +sum = foldl (+) 0 +product = foldl (*) 1 +#else +sum l = sum' l 0 + where + sum' [] a = a + sum' (x:xs) a = sum' xs (a+x) +product l = prod l 1 + where + prod [] a = a + prod (x:xs) a = prod xs (a*x) +#endif +\end{code} + + +%********************************************************* +%* * +\subsection{Prelude monad functions} +%* * +%********************************************************* +\begin{code} +{-# SPECIALISE (=<<) :: (a -> [b]) -> [a] -> [b] #-} +(=<<) :: Monad m => (a -> m b) -> m a -> m b +f =<< x = x >>= f + +sequence :: Monad m => [m a] -> m [a] +{-# INLINE sequence #-} +sequence ms = foldr k (return []) ms + where + k m m' = do { x <- m; xs <- m'; return (x:xs) } + +sequence_ :: Monad m => [m a] -> m () +{-# INLINE sequence_ #-} +sequence_ ms = foldr (>>) (return ()) ms + +mapM :: Monad m => (a -> m b) -> [a] -> m [b] +{-# INLINE mapM #-} +mapM f as = sequence (map f as) + +mapM_ :: Monad m => (a -> m b) -> [a] -> m () +{-# INLINE mapM_ #-} +mapM_ f as = sequence_ (map f as) +\end{code}