4e987026 |
-- Standard value bindings
module Prelude (
PreludeCore.., PreludeRatio.., PreludeComplex.., PreludeList..,
PreludeArray.., PreludeText.., PreludeIO..,
nullBin, isNullBin, appendBin,
(&&), (||), not, otherwise,
minChar, maxChar, ord, chr,
isAscii, isControl, isPrint, isSpace,
isUpper, isLower, isAlpha, isDigit, isAlphanum,
toUpper, toLower,
minInt, maxInt, subtract, gcd, lcm, (^), (^^),
fromIntegral, fromRealFrac, atan2,
fst, snd, id, const, (.), flip, ($), until, asTypeOf, error ) where
{-#Prelude#-} -- Indicates definitions of compiler prelude symbols
import PreludePrims
import PreludeCore
import PreludeList
import PreludeArray
import PreludeRatio
import PreludeComplex
import PreludeText
import PreludeIO
infixr 9 .
infixr 8 ^, ^^
infixr 3 &&
infixr 2 ||
infixr 0 $
-- Binary functions
nullBin :: Bin
nullBin = primNullBin
isNullBin :: Bin -> Bool
isNullBin = primIsNullBin
appendBin :: Bin -> Bin -> Bin
appendBin = primAppendBin
-- Boolean functions
(&&), (||) :: Bool -> Bool -> Bool
True && x = x
False && _ = False
True || _ = True
False || x = x
not :: Bool -> Bool
not True = False
not False = True
{-# (&&) :: Inline #-}
{-# (||) :: Inline #-}
{-# not :: Inline #-}
otherwise :: Bool
otherwise = True
-- Character functions
minChar, maxChar :: Char
minChar = '\0'
maxChar = '\255'
ord :: Char -> Int
ord = primCharToInt
chr :: Int -> Char
chr = primIntToChar
isAscii, isControl, isPrint, isSpace :: Char -> Bool
isUpper, isLower, isAlpha, isDigit, isAlphanum :: Char -> Bool
isAscii c = ord c < 128
isControl c = c < ' ' || c == '\DEL'
isPrint c = c >= ' ' && c <= '~'
isSpace c = c == ' ' || c == '\t' || c == '\n' ||
c == '\r' || c == '\f' || c == '\v'
isUpper c = c >= 'A' && c <= 'Z'
isLower c = c >= 'a' && c <= 'z'
isAlpha c = isUpper c || isLower c
isDigit c = c >= '0' && c <= '9'
isAlphanum c = isAlpha c || isDigit c
toUpper, toLower :: Char -> Char
toUpper c | isLower c = chr ((ord c - ord 'a') + ord 'A')
| otherwise = c
toLower c | isUpper c = chr ((ord c - ord 'A') + ord 'a')
| otherwise = c
-- Numeric functions
minInt, maxInt :: Int
minInt = primMinInt
maxInt = primMaxInt
subtract :: (Num a) => a -> a -> a
subtract = flip (-)
gcd :: (Integral a) => a -> a -> a
gcd 0 0 = error "gcd{Prelude}: gcd 0 0 is undefined"
gcd x y = gcd' (abs x) (abs y)
where gcd' x 0 = x
gcd' x y = gcd' y (x `rem` y)
lcm :: (Integral a) => a -> a -> a
lcm _ 0 = 0
lcm 0 _ = 0
lcm x y = abs ((x `quot` (gcd x y)) * y)
(^) :: (Num a, Integral b) => a -> b -> a
x ^ 0 = 1
x ^ (n+1) = f x n x
where f _ 0 y = y
f x n y = g x n where
g x n | even n = g (x*x) (n `quot` 2)
| otherwise = f x (n-1) (x*y)
_ ^ _ = error "(^){Prelude}: negative exponent"
(^^) :: (Fractional a, Integral b) => a -> b -> a
x ^^ n = if n >= 0 then x^n else recip (x^(-n))
fromIntegral :: (Integral a, Num b) => a -> b
fromIntegral = fromInteger . toInteger
fromRealFrac :: (RealFrac a, Fractional b) => a -> b
fromRealFrac = fromRational . toRational
atan2 :: (RealFloat a) => a -> a -> a
atan2 y x = case (signum y, signum x) of
( 0, 1) -> 0
( 1, 0) -> pi/2
( 0,-1) -> pi
(-1, 0) -> -pi/2
( _, 1) -> atan (y/x)
( _,-1) -> atan (y/x) + pi
( 0, 0) -> error "atan2{Prelude}: atan2 of origin"
-- Some standard functions:
-- component projections for pairs:
fst :: (a,b) -> a
fst (x,y) = x
snd :: (a,b) -> b
snd (x,y) = y
-- identity function
id :: a -> a
id x = x
-- constant function
const :: a -> b -> a
const x _ = x
-- function composition
(.) :: (b -> c) -> (a -> b) -> a -> c
f . g = \ x -> f (g x)
-- flip f takes its (first) two arguments in the reverse order of f.
flip :: (a -> b -> c) -> b -> a -> c
flip f x y = f y x
-- right-associating infix application operator (useful in continuation-
-- passing style)
($) :: (a -> b) -> a -> b
f $ x = f x
-- until p f yields the result of applying f until p holds.
until :: (a -> Bool) -> (a -> a) -> a -> a
until p f x | p x = x
| otherwise = until p f (f x)
-- asTypeOf is a type-restricted version of const. It is usually used
-- as an infix operator, and its typing forces its first argument
-- (which is usually overloaded) to have the same type as the second.
asTypeOf :: a -> a -> a
asTypeOf = const
|