1 {----------------------------------------------------------------------------
2 __ __ __ __ ____ ___ _______________________________________________
3 || || || || || || ||__ Hugs 98: The Nottingham and Yale Haskell system
4 ||___|| ||__|| ||__|| __|| Copyright (c) 1994-1999
5 ||---|| ___|| World Wide Web: http://haskell.org/hugs
6 || || Report bugs to: hugs-bugs@haskell.org
7 || || Version: January 1999 _______________________________________________
9 This is the Hugs 98 Standard Prelude, based very closely on the Standard
10 Prelude for Haskell 98.
12 WARNING: This file is an integral part of the Hugs source code. Changes to
13 the definitions in this file without corresponding modifications in other
14 parts of the program may cause the interpreter to fail unexpectedly. Under
15 normal circumstances, you should not attempt to modify this file in any way!
17 -----------------------------------------------------------------------------
18 Hugs 98 is Copyright (c) Mark P Jones, Alastair Reid and the Yale Haskell
19 Group 1994-99, and is distributed as Open Source software under the
20 Artistic License; see the file "Artistic" that is included in the
21 distribution for details.
22 ----------------------------------------------------------------------------}
25 -- module PreludeList,
26 map, (++), concat, filter,
27 head, last, tail, init, null, length, (!!),
28 foldl, foldl1, scanl, scanl1, foldr, foldr1, scanr, scanr1,
29 iterate, repeat, replicate, cycle,
30 take, drop, splitAt, takeWhile, dropWhile, span, break,
31 lines, words, unlines, unwords, reverse, and, or,
32 any, all, elem, notElem, lookup,
33 sum, product, maximum, minimum, concatMap,
34 zip, zip3, zipWith, zipWith3, unzip, unzip3,
35 -- module PreludeText,
37 Read(readsPrec, readList),
38 Show(show, showsPrec, showList),
39 reads, shows, read, lex,
40 showChar, showString, readParen, showParen,
42 FilePath, IOError, ioError, userError, catch,
43 putChar, putStr, putStrLn, print,
44 getChar, getLine, getContents, interact,
45 readFile, writeFile, appendFile, readIO, readLn,
47 Ix(range, index, inRange, rangeSize),
49 isAscii, isControl, isPrint, isSpace, isUpper, isLower,
50 isAlpha, isDigit, isOctDigit, isHexDigit, isAlphaNum,
51 digitToInt, intToDigit,
54 readLitChar, showLitChar, lexLitChar,
58 readDec, readOct, readHex, readSigned,
61 Ratio, Rational, (%), numerator, denominator, approxRational,
62 -- Non-standard exports
63 IO(..), IOResult(..), Addr, StablePtr,
64 makeStablePtr, freeStablePtr, deRefStablePtr,
70 Char, String, Int, Integer, Float, Double, IO,
71 -- List type: []((:), [])
73 -- Tuple types: (,), (,,), etc.
76 Rec, EmptyRec, EmptyRow, -- non-standard, should only be exported if TREX
78 Ord(compare, (<), (<=), (>=), (>), max, min),
79 Enum(succ, pred, toEnum, fromEnum, enumFrom, enumFromThen,
80 enumFromTo, enumFromThenTo),
81 Bounded(minBound, maxBound),
82 -- Num((+), (-), (*), negate, abs, signum, fromInteger),
83 Num((+), (-), (*), negate, abs, signum, fromInteger, fromInt),
85 -- Integral(quot, rem, div, mod, quotRem, divMod, toInteger),
86 Integral(quot, rem, div, mod, quotRem, divMod, even, odd, toInteger, toInt),
87 -- Fractional((/), recip, fromRational),
88 Fractional((/), recip, fromRational, fromDouble),
89 Floating(pi, exp, log, sqrt, (**), logBase, sin, cos, tan,
90 asin, acos, atan, sinh, cosh, tanh, asinh, acosh, atanh),
91 RealFrac(properFraction, truncate, round, ceiling, floor),
92 RealFloat(floatRadix, floatDigits, floatRange, decodeFloat,
93 encodeFloat, exponent, significand, scaleFloat, isNaN,
94 isInfinite, isDenormalized, isIEEE, isNegativeZero),
95 Monad((>>=), (>>), return, fail),
97 mapM, mapM_, accumulate, sequence, (=<<),
99 (&&), (||), not, otherwise,
100 subtract, even, odd, gcd, lcm, (^), (^^),
101 fromIntegral, realToFrac, atan2,
102 fst, snd, curry, uncurry, id, const, (.), flip, ($), until,
103 asTypeOf, error, undefined,
107 -- Arrrggghhh!!! Help! Help! Help!
108 -- What?! Prelude.hs doesn't even _define_ most of these things!
109 ,primCompAux,PrimArray,primRunST,primNewArray,primWriteArray
110 ,primUnsafeFreezeArray,primIndexArray,primGetRawArgs,primGetEnv
111 ,nh_stdin,nh_stdout,nh_stderr,copy_String_to_cstring,nh_open
112 ,nh_free,nh_close,nh_errno,nh_flush,nh_read,primIntToChar
113 ,unsafeInterleaveIO,nh_write,primCharToInt
119 -- Standard value bindings {Prelude} ----------------------------------------
124 infixl 7 *, /, `quot`, `rem`, `div`, `mod`, :%, %
126 --infixr 5 : -- this fixity declaration is hard-wired into Hugs
128 infix 4 ==, /=, <, <=, >=, >, `elem`, `notElem`
133 infixr 0 $, $!, `seq`
135 -- Equality and Ordered classes ---------------------------------------------
138 (==), (/=) :: a -> a -> Bool
140 -- Minimal complete definition: (==) or (/=)
144 class (Eq a) => Ord a where
145 compare :: a -> a -> Ordering
146 (<), (<=), (>=), (>) :: a -> a -> Bool
147 max, min :: a -> a -> a
149 -- Minimal complete definition: (<=) or compare
150 -- using compare can be more efficient for complex types
151 compare x y | x==y = EQ
155 x <= y = compare x y /= GT
156 x < y = compare x y == LT
157 x >= y = compare x y /= LT
158 x > y = compare x y == GT
165 class Bounded a where
166 minBound, maxBound :: a
167 -- Minimal complete definition: All
169 -- Numeric classes ----------------------------------------------------------
171 class (Eq a, Show a) => Num a where
172 (+), (-), (*) :: a -> a -> a
174 abs, signum :: a -> a
175 fromInteger :: Integer -> a
178 -- Minimal complete definition: All, except negate or (-)
180 fromInt = fromIntegral
183 class (Num a, Ord a) => Real a where
184 toRational :: a -> Rational
186 class (Real a, Enum a) => Integral a where
187 quot, rem, div, mod :: a -> a -> a
188 quotRem, divMod :: a -> a -> (a,a)
189 even, odd :: a -> Bool
190 toInteger :: a -> Integer
193 -- Minimal complete definition: quotRem and toInteger
194 n `quot` d = q where (q,r) = quotRem n d
195 n `rem` d = r where (q,r) = quotRem n d
196 n `div` d = q where (q,r) = divMod n d
197 n `mod` d = r where (q,r) = divMod n d
198 divMod n d = if signum r == - signum d then (q-1, r+d) else qr
199 where qr@(q,r) = quotRem n d
200 even n = n `rem` 2 == 0
202 toInt = toInt . toInteger
204 class (Num a) => Fractional a where
207 fromRational :: Rational -> a
208 fromDouble :: Double -> a
210 -- Minimal complete definition: fromRational and ((/) or recip)
212 fromDouble = fromRational . toRational
216 class (Fractional a) => Floating a where
218 exp, log, sqrt :: a -> a
219 (**), logBase :: a -> a -> a
220 sin, cos, tan :: a -> a
221 asin, acos, atan :: a -> a
222 sinh, cosh, tanh :: a -> a
223 asinh, acosh, atanh :: a -> a
225 -- Minimal complete definition: pi, exp, log, sin, cos, sinh, cosh,
226 -- asinh, acosh, atanh
227 x ** y = exp (log x * y)
228 logBase x y = log y / log x
230 tan x = sin x / cos x
231 sinh x = (exp x - exp (-x)) / 2
232 cosh x = (exp x + exp (-x)) / 2
233 tanh x = sinh x / cosh x
234 asinh x = log (x + sqrt (x*x + 1))
235 acosh x = log (x + sqrt (x*x - 1))
236 atanh x = (log (1 + x) - log (1 - x)) / 2
238 class (Real a, Fractional a) => RealFrac a where
239 properFraction :: (Integral b) => a -> (b,a)
240 truncate, round :: (Integral b) => a -> b
241 ceiling, floor :: (Integral b) => a -> b
243 -- Minimal complete definition: properFraction
244 truncate x = m where (m,_) = properFraction x
246 round x = let (n,r) = properFraction x
247 m = if r < 0 then n - 1 else n + 1
248 in case signum (abs r - 0.5) of
250 0 -> if even n then n else m
253 ceiling x = if r > 0 then n + 1 else n
254 where (n,r) = properFraction x
256 floor x = if r < 0 then n - 1 else n
257 where (n,r) = properFraction x
259 class (RealFrac a, Floating a) => RealFloat a where
260 floatRadix :: a -> Integer
261 floatDigits :: a -> Int
262 floatRange :: a -> (Int,Int)
263 decodeFloat :: a -> (Integer,Int)
264 encodeFloat :: Integer -> Int -> a
266 significand :: a -> a
267 scaleFloat :: Int -> a -> a
268 isNaN, isInfinite, isDenormalized, isNegativeZero, isIEEE
272 -- Minimal complete definition: All, except exponent, signficand,
274 exponent x = if m==0 then 0 else n + floatDigits x
275 where (m,n) = decodeFloat x
276 significand x = encodeFloat m (- floatDigits x)
277 where (m,_) = decodeFloat x
278 scaleFloat k x = encodeFloat m (n+k)
279 where (m,n) = decodeFloat x
283 | x<0 && y>0 = pi + atan (y/x)
285 (x<0 && isNegativeZero y) ||
286 (isNegativeZero x && isNegativeZero y)
288 | y==0 && (x<0 || isNegativeZero x)
289 = pi -- must be after the previous test on zero y
290 | x==0 && y==0 = y -- must be after the other double zero tests
291 | otherwise = x + y -- x or y is a NaN, return a NaN (via +)
293 -- Numeric functions --------------------------------------------------------
295 subtract :: Num a => a -> a -> a
298 gcd :: Integral a => a -> a -> a
299 gcd 0 0 = error "Prelude.gcd: gcd 0 0 is undefined"
300 gcd x y = gcd' (abs x) (abs y)
302 gcd' x y = gcd' y (x `rem` y)
304 lcm :: (Integral a) => a -> a -> a
307 lcm x y = abs ((x `quot` gcd x y) * y)
309 (^) :: (Num a, Integral b) => a -> b -> a
311 x ^ n | n > 0 = f x (n-1) x
313 f x n y = g x n where
314 g x n | even n = g (x*x) (n`quot`2)
315 | otherwise = f x (n-1) (x*y)
316 _ ^ _ = error "Prelude.^: negative exponent"
318 (^^) :: (Fractional a, Integral b) => a -> b -> a
319 x ^^ n = if n >= 0 then x ^ n else recip (x^(-n))
321 fromIntegral :: (Integral a, Num b) => a -> b
322 fromIntegral = fromInteger . toInteger
324 realToFrac :: (Real a, Fractional b) => a -> b
325 realToFrac = fromRational . toRational
327 -- Index and Enumeration classes --------------------------------------------
329 class (Ord a) => Ix a where
330 range :: (a,a) -> [a]
331 index :: (a,a) -> a -> Int
332 inRange :: (a,a) -> a -> Bool
333 rangeSize :: (a,a) -> Int
337 | otherwise = index r u + 1
343 enumFrom :: a -> [a] -- [n..]
344 enumFromThen :: a -> a -> [a] -- [n,m..]
345 enumFromTo :: a -> a -> [a] -- [n..m]
346 enumFromThenTo :: a -> a -> a -> [a] -- [n,n'..m]
348 -- Minimal complete definition: toEnum, fromEnum
349 succ = toEnum . (1+) . fromEnum
350 pred = toEnum . subtract 1 . fromEnum
351 enumFromTo x y = map toEnum [ fromEnum x .. fromEnum y ]
352 enumFromThenTo x y z = map toEnum [ fromEnum x, fromEnum y .. fromEnum z ]
354 -- Read and Show classes ------------------------------------------------------
356 type ReadS a = String -> [(a,String)]
357 type ShowS = String -> String
360 readsPrec :: Int -> ReadS a
361 readList :: ReadS [a]
363 -- Minimal complete definition: readsPrec
364 readList = readParen False (\r -> [pr | ("[",s) <- lex r,
366 where readl s = [([],t) | ("]",t) <- lex s] ++
367 [(x:xs,u) | (x,t) <- reads s,
369 readl' s = [([],t) | ("]",t) <- lex s] ++
370 [(x:xs,v) | (",",t) <- lex s,
376 showsPrec :: Int -> a -> ShowS
377 showList :: [a] -> ShowS
379 -- Minimal complete definition: show or showsPrec
380 show x = showsPrec 0 x ""
381 showsPrec _ x s = show x ++ s
382 showList [] = showString "[]"
383 showList (x:xs) = showChar '[' . shows x . showl xs
384 where showl [] = showChar ']'
385 showl (x:xs) = showChar ',' . shows x . showl xs
387 -- Monad classes ------------------------------------------------------------
389 class Functor f where
390 fmap :: (a -> b) -> (f a -> f b)
394 (>>=) :: m a -> (a -> m b) -> m b
395 (>>) :: m a -> m b -> m b
396 fail :: String -> m a
398 -- Minimal complete definition: (>>=), return
399 p >> q = p >>= \ _ -> q
402 accumulate :: Monad m => [m a] -> m [a]
403 accumulate [] = return []
404 accumulate (c:cs) = do x <- c
408 sequence :: Monad m => [m a] -> m ()
409 sequence = foldr (>>) (return ())
411 mapM :: Monad m => (a -> m b) -> [a] -> m [b]
412 mapM f = accumulate . map f
414 mapM_ :: Monad m => (a -> m b) -> [a] -> m ()
415 mapM_ f = sequence . map f
417 (=<<) :: Monad m => (a -> m b) -> m a -> m b
420 -- Evaluation and strictness ------------------------------------------------
423 seq x y = primSeq x y
425 ($!) :: (a -> b) -> a -> b
426 f $! x = x `primSeq` f x
428 -- Trivial type -------------------------------------------------------------
430 -- data () = () deriving (Eq, Ord, Ix, Enum, Read, Show, Bounded)
435 instance Ord () where
441 inRange ((),()) () = True
443 instance Enum () where
447 enumFromThen () () = [()]
449 instance Read () where
450 readsPrec p = readParen False (\r -> [((),t) | ("(",s) <- lex r,
453 instance Show () where
454 showsPrec p () = showString "()"
456 instance Bounded () where
460 -- Boolean type -------------------------------------------------------------
462 data Bool = False | True
463 deriving (Eq, Ord, Ix, Enum, Read, Show, Bounded)
465 (&&), (||) :: Bool -> Bool -> Bool
478 -- Character type -----------------------------------------------------------
480 data Char -- builtin datatype of ISO Latin characters
481 type String = [Char] -- strings are lists of characters
483 instance Eq Char where (==) = primEqChar
484 instance Ord Char where (<=) = primLeChar
486 instance Enum Char where
487 toEnum = primIntToChar
488 fromEnum = primCharToInt
489 enumFrom c = map toEnum [fromEnum c .. fromEnum (maxBound::Char)]
490 enumFromThen c d = map toEnum [fromEnum c, fromEnum d .. fromEnum (lastChar::Char)]
491 where lastChar = if d < c then minBound else maxBound
493 instance Ix Char where
494 range (c,c') = [c..c']
496 | inRange b ci = fromEnum ci - fromEnum c
497 | otherwise = error "Ix.index: Index out of range."
498 inRange (c,c') ci = fromEnum c <= i && i <= fromEnum c'
499 where i = fromEnum ci
501 instance Read Char where
502 readsPrec p = readParen False
503 (\r -> [(c,t) | ('\'':s,t) <- lex r,
504 (c,"\'") <- readLitChar s ])
505 readList = readParen False (\r -> [(l,t) | ('"':s, t) <- lex r,
507 where readl ('"':s) = [("",s)]
508 readl ('\\':'&':s) = readl s
509 readl s = [(c:cs,u) | (c ,t) <- readLitChar s,
511 instance Show Char where
512 showsPrec p '\'' = showString "'\\''"
513 showsPrec p c = showChar '\'' . showLitChar c . showChar '\''
515 showList cs = showChar '"' . showl cs
516 where showl "" = showChar '"'
517 showl ('"':cs) = showString "\\\"" . showl cs
518 showl (c:cs) = showLitChar c . showl cs
520 instance Bounded Char where
524 isAscii, isControl, isPrint, isSpace :: Char -> Bool
525 isUpper, isLower, isAlpha, isDigit, isAlphaNum :: Char -> Bool
527 isAscii c = fromEnum c < 128
528 isControl c = c < ' ' || c == '\DEL'
529 isPrint c = c >= ' ' && c <= '~'
530 isSpace c = c == ' ' || c == '\t' || c == '\n' ||
531 c == '\r' || c == '\f' || c == '\v'
532 isUpper c = c >= 'A' && c <= 'Z'
533 isLower c = c >= 'a' && c <= 'z'
534 isAlpha c = isUpper c || isLower c
535 isDigit c = c >= '0' && c <= '9'
536 isAlphaNum c = isAlpha c || isDigit c
538 -- Digit conversion operations
539 digitToInt :: Char -> Int
541 | isDigit c = fromEnum c - fromEnum '0'
542 | c >= 'a' && c <= 'f' = fromEnum c - fromEnum 'a' + 10
543 | c >= 'A' && c <= 'F' = fromEnum c - fromEnum 'A' + 10
544 | otherwise = error "Char.digitToInt: not a digit"
546 intToDigit :: Int -> Char
548 | i >= 0 && i <= 9 = toEnum (fromEnum '0' + i)
549 | i >= 10 && i <= 15 = toEnum (fromEnum 'a' + i - 10)
550 | otherwise = error "Char.intToDigit: not a digit"
552 toUpper, toLower :: Char -> Char
553 toUpper c | isLower c = toEnum (fromEnum c - fromEnum 'a' + fromEnum 'A')
556 toLower c | isUpper c = toEnum (fromEnum c - fromEnum 'A' + fromEnum 'a')
565 -- Maybe type ---------------------------------------------------------------
567 data Maybe a = Nothing | Just a
568 deriving (Eq, Ord, Read, Show)
570 maybe :: b -> (a -> b) -> Maybe a -> b
571 maybe n f Nothing = n
572 maybe n f (Just x) = f x
574 instance Functor Maybe where
575 fmap f Nothing = Nothing
576 fmap f (Just x) = Just (f x)
578 instance Monad Maybe where
580 Nothing >>= k = Nothing
584 -- Either type --------------------------------------------------------------
586 data Either a b = Left a | Right b
587 deriving (Eq, Ord, Read, Show)
589 either :: (a -> c) -> (b -> c) -> Either a b -> c
590 either l r (Left x) = l x
591 either l r (Right y) = r y
593 -- Ordering type ------------------------------------------------------------
595 data Ordering = LT | EQ | GT
596 deriving (Eq, Ord, Ix, Enum, Read, Show, Bounded)
598 -- Lists --------------------------------------------------------------------
600 --data [a] = [] | a : [a] deriving (Eq, Ord)
602 instance Eq a => Eq [a] where
604 (x:xs) == (y:ys) = x==y && xs==ys
607 instance Ord a => Ord [a] where
608 compare [] (_:_) = LT
610 compare (_:_) [] = GT
611 compare (x:xs) (y:ys) = primCompAux x y (compare xs ys)
613 instance Functor [] where
616 instance Monad [ ] where
617 (x:xs) >>= f = f x ++ (xs >>= f)
622 instance Read a => Read [a] where
623 readsPrec p = readList
625 instance Show a => Show [a] where
626 showsPrec p = showList
628 -- Tuples -------------------------------------------------------------------
630 -- data (a,b) = (a,b) deriving (Eq, Ord, Ix, Read, Show)
633 -- Functions ----------------------------------------------------------------
635 instance Show (a -> b) where
636 showsPrec p f = showString "<<function>>"
638 instance Functor ((->) a) where
641 -- Standard Integral types --------------------------------------------------
643 data Int -- builtin datatype of fixed size integers
644 data Integer -- builtin datatype of arbitrary size integers
646 instance Eq Integer where
647 (==) x y = primCompareInteger x y == 0
649 instance Ord Integer where
650 compare x y = case primCompareInteger x y of
655 instance Eq Int where
659 instance Ord Int where
665 instance Num Int where
668 negate = primNegateInt
672 fromInteger = primIntegerToInt
675 instance Bounded Int where
676 minBound = primMinInt
677 maxBound = primMaxInt
679 instance Num Integer where
680 (+) = primPlusInteger
681 (-) = primMinusInteger
682 negate = primNegateInteger
683 (*) = primTimesInteger
687 fromInt = primIntToInteger
689 absReal x | x >= 0 = x
692 signumReal x | x == 0 = 0
696 instance Real Int where
697 toRational x = toInteger x % 1
699 instance Real Integer where
702 instance Integral Int where
703 quotRem = primQuotRemInt
704 toInteger = primIntToInteger
707 instance Integral Integer where
708 quotRem = primQuotRemInteger
709 --divMod = primDivModInteger
711 toInt = primIntegerToInt
713 instance Ix Int where
716 | inRange b i = i - m
717 | otherwise = error "index: Index out of range"
718 inRange (m,n) i = m <= i && i <= n
720 instance Ix Integer where
723 | inRange b i = fromInteger (i - m)
724 | otherwise = error "index: Index out of range"
725 inRange (m,n) i = m <= i && i <= n
727 instance Enum Int where
730 enumFrom = numericEnumFrom
731 enumFromTo = numericEnumFromTo
732 enumFromThen = numericEnumFromThen
733 enumFromThenTo = numericEnumFromThenTo
735 instance Enum Integer where
736 toEnum = primIntToInteger
737 fromEnum = primIntegerToInt
738 enumFrom = numericEnumFrom
739 enumFromTo = numericEnumFromTo
740 enumFromThen = numericEnumFromThen
741 enumFromThenTo = numericEnumFromThenTo
743 numericEnumFrom :: Real a => a -> [a]
744 numericEnumFromThen :: Real a => a -> a -> [a]
745 numericEnumFromTo :: Real a => a -> a -> [a]
746 numericEnumFromThenTo :: Real a => a -> a -> a -> [a]
747 numericEnumFrom n = n : (numericEnumFrom $! (n+1))
748 numericEnumFromThen n m = iterate ((m-n)+) n
749 numericEnumFromTo n m = takeWhile (<= m) (numericEnumFrom n)
750 numericEnumFromThenTo n n' m = takeWhile p (numericEnumFromThen n n')
751 where p | n' >= n = (<= m)
754 instance Read Int where
755 readsPrec p = readSigned readDec
757 instance Show Int where
759 | n == minBound = showSigned showInt p (toInteger n)
760 | otherwise = showSigned showInt p n
762 instance Read Integer where
763 readsPrec p = readSigned readDec
765 instance Show Integer where
766 showsPrec = showSigned showInt
769 -- Standard Floating types --------------------------------------------------
771 data Float -- builtin datatype of single precision floating point numbers
772 data Double -- builtin datatype of double precision floating point numbers
774 instance Eq Float where
778 instance Ord Float where
784 instance Num Float where
787 negate = primNegateFloat
791 fromInteger = primIntegerToFloat
792 fromInt = primIntToFloat
796 instance Eq Double where
800 instance Ord Double where
806 instance Num Double where
808 (-) = primMinusDouble
809 negate = primNegateDouble
810 (*) = primTimesDouble
813 fromInteger = primIntegerToDouble
814 fromInt = primIntToDouble
818 instance Real Float where
819 toRational = floatToRational
821 instance Real Double where
822 toRational = doubleToRational
824 -- Calls to these functions are optimised when passed as arguments to
826 floatToRational :: Float -> Rational
827 doubleToRational :: Double -> Rational
828 floatToRational x = realFloatToRational x
829 doubleToRational x = realFloatToRational x
831 realFloatToRational x = (m%1)*(b%1)^^n
832 where (m,n) = decodeFloat x
835 instance Fractional Float where
836 (/) = primDivideFloat
837 fromRational = rationalToRealFloat
838 fromDouble = primDoubleToFloat
841 instance Fractional Double where
842 (/) = primDivideDouble
843 fromRational = rationalToRealFloat
846 rationalToRealFloat x = x'
848 f e = if e' == e then y else f e'
849 where y = encodeFloat (round (x * (1%b)^^e)) e
850 (_,e') = decodeFloat y
851 (_,e) = decodeFloat (fromInteger (numerator x) `asTypeOf` x'
852 / fromInteger (denominator x))
855 instance Floating Float where
856 pi = 3.14159265358979323846
867 instance Floating Double where
868 pi = 3.14159265358979323846
871 sqrt = primSqrtDouble
875 asin = primAsinDouble
876 acos = primAcosDouble
877 atan = primAtanDouble
879 instance RealFrac Float where
880 properFraction = floatProperFraction
882 instance RealFrac Double where
883 properFraction = floatProperFraction
885 floatProperFraction x
886 | n >= 0 = (fromInteger m * fromInteger b ^ n, 0)
887 | otherwise = (fromInteger w, encodeFloat r n)
888 where (m,n) = decodeFloat x
890 (w,r) = quotRem m (b^(-n))
892 instance RealFloat Float where
893 floatRadix _ = toInteger primRadixFloat
894 floatDigits _ = primDigitsFloat
895 floatRange _ = (primMinExpFloat,primMaxExpFloat)
896 encodeFloat = primEncodeFloatZ
897 decodeFloat = primDecodeFloatZ
898 isNaN = primIsNaNFloat
899 isInfinite = primIsInfiniteFloat
900 isDenormalized= primIsDenormalizedFloat
901 isNegativeZero= primIsNegativeZeroFloat
902 isIEEE = const primIsIEEEFloat
904 instance RealFloat Double where
905 floatRadix _ = toInteger primRadixDouble
906 floatDigits _ = primDigitsDouble
907 floatRange _ = (primMinExpDouble,primMaxExpDouble)
908 encodeFloat = primEncodeDoubleZ
909 decodeFloat = primDecodeDoubleZ
910 isNaN = primIsNaNDouble
911 isInfinite = primIsInfiniteDouble
912 isDenormalized= primIsDenormalizedDouble
913 isNegativeZero= primIsNegativeZeroDouble
914 isIEEE = const primIsIEEEDouble
916 instance Enum Float where
917 toEnum = primIntToFloat
919 enumFrom = numericEnumFrom
920 enumFromThen = numericEnumFromThen
921 enumFromTo n m = numericEnumFromTo n (m+1/2)
922 enumFromThenTo n n' m = numericEnumFromThenTo n n' (m + (n'-n)/2)
924 instance Enum Double where
925 toEnum = primIntToDouble
927 enumFrom = numericEnumFrom
928 enumFromThen = numericEnumFromThen
929 enumFromTo n m = numericEnumFromTo n (m+1/2)
930 enumFromThenTo n n' m = numericEnumFromThenTo n n' (m + (n'-n)/2)
932 instance Read Float where
933 readsPrec p = readSigned readFloat
935 instance Show Float where
936 showsPrec p = showSigned showFloat p
938 instance Read Double where
939 readsPrec p = readSigned readFloat
941 instance Show Double where
942 showsPrec p = showSigned showFloat p
945 -- Some standard functions --------------------------------------------------
953 curry :: ((a,b) -> c) -> (a -> b -> c)
954 curry f x y = f (x,y)
956 uncurry :: (a -> b -> c) -> ((a,b) -> c)
957 uncurry f p = f (fst p) (snd p)
965 (.) :: (b -> c) -> (a -> b) -> (a -> c)
968 flip :: (a -> b -> c) -> b -> a -> c
971 ($) :: (a -> b) -> a -> b
974 until :: (a -> Bool) -> (a -> a) -> a -> a
975 until p f x = if p x then x else until p f (f x)
977 asTypeOf :: a -> a -> a
981 error msg = primRaise (ErrorCall msg)
984 undefined | False = undefined
986 -- Standard functions on rational numbers {PreludeRatio} --------------------
988 data Integral a => Ratio a = a :% a deriving (Eq)
989 type Rational = Ratio Integer
991 (%) :: Integral a => a -> a -> Ratio a
992 x % y = reduce (x * signum y) (abs y)
994 reduce :: Integral a => a -> a -> Ratio a
995 reduce x y | y == 0 = error "Ratio.%: zero denominator"
996 | otherwise = (x `quot` d) :% (y `quot` d)
999 numerator, denominator :: Integral a => Ratio a -> a
1000 numerator (x :% y) = x
1001 denominator (x :% y) = y
1003 instance Integral a => Ord (Ratio a) where
1004 compare (x:%y) (x':%y') = compare (x*y') (x'*y)
1006 instance Integral a => Num (Ratio a) where
1007 (x:%y) + (x':%y') = reduce (x*y' + x'*y) (y*y')
1008 (x:%y) * (x':%y') = reduce (x*x') (y*y')
1009 negate (x :% y) = negate x :% y
1010 abs (x :% y) = abs x :% y
1011 signum (x :% y) = signum x :% 1
1012 fromInteger x = fromInteger x :% 1
1013 fromInt = intToRatio
1015 -- Hugs optimises code of the form fromRational (intToRatio x)
1016 intToRatio :: Integral a => Int -> Ratio a
1017 intToRatio x = fromInt x :% 1
1019 instance Integral a => Real (Ratio a) where
1020 toRational (x:%y) = toInteger x :% toInteger y
1022 instance Integral a => Fractional (Ratio a) where
1023 (x:%y) / (x':%y') = (x*y') % (y*x')
1024 recip (x:%y) = if x < 0 then (-y) :% (-x) else y :% x
1025 fromRational (x:%y) = fromInteger x :% fromInteger y
1026 fromDouble = doubleToRatio
1028 -- Hugs optimises code of the form fromRational (doubleToRatio x)
1029 doubleToRatio :: Integral a => Double -> Ratio a
1031 | n>=0 = (fromInteger m * fromInteger b ^ n) % 1
1032 | otherwise = fromInteger m % (fromInteger b ^ (-n))
1033 where (m,n) = decodeFloat x
1036 instance Integral a => RealFrac (Ratio a) where
1037 properFraction (x:%y) = (fromIntegral q, r:%y)
1038 where (q,r) = quotRem x y
1040 instance Integral a => Enum (Ratio a) where
1043 enumFrom = numericEnumFrom
1044 enumFromThen = numericEnumFromThen
1046 instance (Read a, Integral a) => Read (Ratio a) where
1047 readsPrec p = readParen (p > 7)
1048 (\r -> [(x%y,u) | (x,s) <- reads r,
1052 instance Integral a => Show (Ratio a) where
1053 showsPrec p (x:%y) = showParen (p > 7)
1054 (shows x . showString " % " . shows y)
1056 approxRational :: RealFrac a => a -> a -> Rational
1057 approxRational x eps = simplest (x-eps) (x+eps)
1058 where simplest x y | y < x = simplest y x
1060 | x > 0 = simplest' n d n' d'
1061 | y < 0 = - simplest' (-n') d' (-n) d
1062 | otherwise = 0 :% 1
1063 where xr@(n:%d) = toRational x
1064 (n':%d') = toRational y
1065 simplest' n d n' d' -- assumes 0 < n%d < n'%d'
1067 | q /= q' = (q+1) :% 1
1068 | otherwise = (q*n''+d'') :% n''
1069 where (q,r) = quotRem n d
1070 (q',r') = quotRem n' d'
1071 (n'':%d'') = simplest' d' r' d r
1073 -- Standard list functions {PreludeList} ------------------------------------
1080 last (_:xs) = last xs
1087 init (x:xs) = x : init xs
1093 (++) :: [a] -> [a] -> [a]
1095 (x:xs) ++ ys = x : (xs ++ ys)
1097 map :: (a -> b) -> [a] -> [b]
1098 --map f xs = [ f x | x <- xs ]
1100 map f (x:xs) = f x : map f xs
1103 filter :: (a -> Bool) -> [a] -> [a]
1104 --filter p xs = [ x | x <- xs, p x ]
1106 filter p (x:xs) = if p x then x : filter p xs else filter p xs
1109 concat :: [[a]] -> [a]
1110 --concat = foldr (++) []
1112 concat (xs:xss) = xs ++ concat xss
1114 length :: [a] -> Int
1115 --length = foldl' (\n _ -> n + 1) 0
1117 length (x:xs) = let n = length xs in primSeq n (1+n)
1119 (!!) :: [b] -> Int -> b
1121 (_:xs) !! n | n>0 = xs !! (n-1)
1122 (_:_) !! _ = error "Prelude.!!: negative index"
1123 [] !! _ = error "Prelude.!!: index too large"
1125 foldl :: (a -> b -> a) -> a -> [b] -> a
1127 foldl f z (x:xs) = foldl f (f z x) xs
1129 foldl' :: (a -> b -> a) -> a -> [b] -> a
1131 foldl' f a (x:xs) = (foldl' f $! f a x) xs
1133 foldl1 :: (a -> a -> a) -> [a] -> a
1134 foldl1 f (x:xs) = foldl f x xs
1136 scanl :: (a -> b -> a) -> a -> [b] -> [a]
1137 scanl f q xs = q : (case xs of
1139 x:xs -> scanl f (f q x) xs)
1141 scanl1 :: (a -> a -> a) -> [a] -> [a]
1142 scanl1 f (x:xs) = scanl f x xs
1144 foldr :: (a -> b -> b) -> b -> [a] -> b
1146 foldr f z (x:xs) = f x (foldr f z xs)
1148 foldr1 :: (a -> a -> a) -> [a] -> a
1150 foldr1 f (x:xs) = f x (foldr1 f xs)
1152 scanr :: (a -> b -> b) -> b -> [a] -> [b]
1153 scanr f q0 [] = [q0]
1154 scanr f q0 (x:xs) = f x q : qs
1155 where qs@(q:_) = scanr f q0 xs
1157 scanr1 :: (a -> a -> a) -> [a] -> [a]
1159 scanr1 f (x:xs) = f x q : qs
1160 where qs@(q:_) = scanr1 f xs
1162 iterate :: (a -> a) -> a -> [a]
1163 iterate f x = x : iterate f (f x)
1166 repeat x = xs where xs = x:xs
1168 replicate :: Int -> a -> [a]
1169 replicate n x = take n (repeat x)
1172 cycle [] = error "Prelude.cycle: empty list"
1173 cycle xs = xs' where xs'=xs++xs'
1175 take :: Int -> [a] -> [a]
1178 take n (x:xs) | n>0 = x : take (n-1) xs
1179 take _ _ = error "Prelude.take: negative argument"
1181 drop :: Int -> [a] -> [a]
1184 drop n (_:xs) | n>0 = drop (n-1) xs
1185 drop _ _ = error "Prelude.drop: negative argument"
1187 splitAt :: Int -> [a] -> ([a], [a])
1188 splitAt 0 xs = ([],xs)
1189 splitAt _ [] = ([],[])
1190 splitAt n (x:xs) | n>0 = (x:xs',xs'') where (xs',xs'') = splitAt (n-1) xs
1191 splitAt _ _ = error "Prelude.splitAt: negative argument"
1193 takeWhile :: (a -> Bool) -> [a] -> [a]
1196 | p x = x : takeWhile p xs
1199 dropWhile :: (a -> Bool) -> [a] -> [a]
1201 dropWhile p xs@(x:xs')
1202 | p x = dropWhile p xs'
1205 span, break :: (a -> Bool) -> [a] -> ([a],[a])
1209 | otherwise = ([],xs)
1210 where (ys,zs) = span p xs'
1211 break p = span (not . p)
1213 lines :: String -> [String]
1215 lines s = let (l,s') = break ('\n'==) s
1216 in l : case s' of [] -> []
1217 (_:s'') -> lines s''
1219 words :: String -> [String]
1220 words s = case dropWhile isSpace s of
1223 where (w,s'') = break isSpace s'
1225 unlines :: [String] -> String
1226 unlines = concatMap (\l -> l ++ "\n")
1228 unwords :: [String] -> String
1230 unwords ws = foldr1 (\w s -> w ++ ' ':s) ws
1232 reverse :: [a] -> [a]
1233 --reverse = foldl (flip (:)) []
1234 reverse xs = ri [] xs
1235 where ri acc [] = acc
1236 ri acc (x:xs) = ri (x:acc) xs
1238 and, or :: [Bool] -> Bool
1239 --and = foldr (&&) True
1240 --or = foldr (||) False
1242 and (x:xs) = if x then and xs else x
1244 or (x:xs) = if x then x else or xs
1246 any, all :: (a -> Bool) -> [a] -> Bool
1247 --any p = or . map p
1248 --all p = and . map p
1250 any p (x:xs) = if p x then True else any p xs
1252 all p (x:xs) = if p x then all p xs else False
1254 elem, notElem :: Eq a => a -> [a] -> Bool
1256 --notElem = all . (/=)
1258 elem x (y:ys) = if x==y then True else elem x ys
1260 notElem x (y:ys) = if x==y then False else notElem x ys
1262 lookup :: Eq a => a -> [(a,b)] -> Maybe b
1263 lookup k [] = Nothing
1264 lookup k ((x,y):xys)
1266 | otherwise = lookup k xys
1268 sum, product :: Num a => [a] -> a
1270 product = foldl' (*) 1
1272 maximum, minimum :: Ord a => [a] -> a
1273 maximum = foldl1 max
1274 minimum = foldl1 min
1276 concatMap :: (a -> [b]) -> [a] -> [b]
1277 concatMap f = concat . map f
1279 zip :: [a] -> [b] -> [(a,b)]
1280 zip = zipWith (\a b -> (a,b))
1282 zip3 :: [a] -> [b] -> [c] -> [(a,b,c)]
1283 zip3 = zipWith3 (\a b c -> (a,b,c))
1285 zipWith :: (a->b->c) -> [a]->[b]->[c]
1286 zipWith z (a:as) (b:bs) = z a b : zipWith z as bs
1289 zipWith3 :: (a->b->c->d) -> [a]->[b]->[c]->[d]
1290 zipWith3 z (a:as) (b:bs) (c:cs)
1291 = z a b c : zipWith3 z as bs cs
1292 zipWith3 _ _ _ _ = []
1294 unzip :: [(a,b)] -> ([a],[b])
1295 unzip = foldr (\(a,b) ~(as,bs) -> (a:as, b:bs)) ([], [])
1297 unzip3 :: [(a,b,c)] -> ([a],[b],[c])
1298 unzip3 = foldr (\(a,b,c) ~(as,bs,cs) -> (a:as,b:bs,c:cs))
1301 -- PreludeText ----------------------------------------------------------------
1303 reads :: Read a => ReadS a
1306 shows :: Show a => a -> ShowS
1309 read :: Read a => String -> a
1310 read s = case [x | (x,t) <- reads s, ("","") <- lex t] of
1312 [] -> error "Prelude.read: no parse"
1313 _ -> error "Prelude.read: ambiguous parse"
1315 showChar :: Char -> ShowS
1318 showString :: String -> ShowS
1321 showParen :: Bool -> ShowS -> ShowS
1322 showParen b p = if b then showChar '(' . p . showChar ')' else p
1324 showField :: Show a => String -> a -> ShowS
1325 showField m v = showString m . showChar '=' . shows v
1327 readParen :: Bool -> ReadS a -> ReadS a
1328 readParen b g = if b then mandatory else optional
1329 where optional r = g r ++ mandatory r
1330 mandatory r = [(x,u) | ("(",s) <- lex r,
1331 (x,t) <- optional s,
1335 readField :: Read a => String -> ReadS a
1336 readField m s0 = [ r | (t, s1) <- lex s0, t == m,
1342 lex (c:s) | isSpace c = lex (dropWhile isSpace s)
1343 lex ('\'':s) = [('\'':ch++"'", t) | (ch,'\'':t) <- lexLitChar s,
1345 lex ('"':s) = [('"':str, t) | (str,t) <- lexString s]
1347 lexString ('"':s) = [("\"",s)]
1348 lexString s = [(ch++str, u)
1349 | (ch,t) <- lexStrItem s,
1350 (str,u) <- lexString t ]
1352 lexStrItem ('\\':'&':s) = [("\\&",s)]
1353 lexStrItem ('\\':c:s) | isSpace c
1354 = [("",t) | '\\':t <- [dropWhile isSpace s]]
1355 lexStrItem s = lexLitChar s
1357 lex (c:s) | isSingle c = [([c],s)]
1358 | isSym c = [(c:sym,t) | (sym,t) <- [span isSym s]]
1359 | isAlpha c = [(c:nam,t) | (nam,t) <- [span isIdChar s]]
1360 | isDigit c = [(c:ds++fe,t) | (ds,s) <- [span isDigit s],
1361 (fe,t) <- lexFracExp s ]
1362 | otherwise = [] -- bad character
1364 isSingle c = c `elem` ",;()[]{}_`"
1365 isSym c = c `elem` "!@#$%&*+./<=>?\\^|:-~"
1366 isIdChar c = isAlphaNum c || c `elem` "_'"
1368 lexFracExp ('.':s) = [('.':ds++e,u) | (ds,t) <- lexDigits s,
1370 lexFracExp s = [("",s)]
1372 lexExp (e:s) | e `elem` "eE"
1373 = [(e:c:ds,u) | (c:t) <- [s], c `elem` "+-",
1374 (ds,u) <- lexDigits t] ++
1375 [(e:ds,t) | (ds,t) <- lexDigits s]
1378 lexDigits :: ReadS String
1379 lexDigits = nonnull isDigit
1381 nonnull :: (Char -> Bool) -> ReadS String
1382 nonnull p s = [(cs,t) | (cs@(_:_),t) <- [span p s]]
1384 lexLitChar :: ReadS String
1385 lexLitChar ('\\':s) = [('\\':esc, t) | (esc,t) <- lexEsc s]
1387 lexEsc (c:s) | c `elem` "abfnrtv\\\"'" = [([c],s)] -- "
1388 lexEsc ('^':c:s) | c >= '@' && c <= '_' = [(['^',c],s)]
1389 lexEsc s@(d:_) | isDigit d = lexDigits s
1390 lexEsc s@(c:_) | isUpper c
1391 = let table = ('\DEL',"DEL") : asciiTab
1392 in case [(mne,s') | (c, mne) <- table,
1393 ([],s') <- [lexmatch mne s]]
1397 lexLitChar (c:s) = [([c],s)]
1400 isOctDigit c = c >= '0' && c <= '7'
1401 isHexDigit c = isDigit c || c >= 'A' && c <= 'F'
1402 || c >= 'a' && c <= 'f'
1404 lexmatch :: (Eq a) => [a] -> [a] -> ([a],[a])
1405 lexmatch (x:xs) (y:ys) | x == y = lexmatch xs ys
1406 lexmatch xs ys = (xs,ys)
1408 asciiTab = zip ['\NUL'..' ']
1409 ["NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK", "BEL",
1410 "BS", "HT", "LF", "VT", "FF", "CR", "SO", "SI",
1411 "DLE", "DC1", "DC2", "DC3", "DC4", "NAK", "SYN", "ETB",
1412 "CAN", "EM", "SUB", "ESC", "FS", "GS", "RS", "US",
1415 readLitChar :: ReadS Char
1416 readLitChar ('\\':s) = readEsc s
1418 readEsc ('a':s) = [('\a',s)]
1419 readEsc ('b':s) = [('\b',s)]
1420 readEsc ('f':s) = [('\f',s)]
1421 readEsc ('n':s) = [('\n',s)]
1422 readEsc ('r':s) = [('\r',s)]
1423 readEsc ('t':s) = [('\t',s)]
1424 readEsc ('v':s) = [('\v',s)]
1425 readEsc ('\\':s) = [('\\',s)]
1426 readEsc ('"':s) = [('"',s)]
1427 readEsc ('\'':s) = [('\'',s)]
1428 readEsc ('^':c:s) | c >= '@' && c <= '_'
1429 = [(toEnum (fromEnum c - fromEnum '@'), s)]
1430 readEsc s@(d:_) | isDigit d
1431 = [(toEnum n, t) | (n,t) <- readDec s]
1432 readEsc ('o':s) = [(toEnum n, t) | (n,t) <- readOct s]
1433 readEsc ('x':s) = [(toEnum n, t) | (n,t) <- readHex s]
1434 readEsc s@(c:_) | isUpper c
1435 = let table = ('\DEL',"DEL") : asciiTab
1436 in case [(c,s') | (c, mne) <- table,
1437 ([],s') <- [lexmatch mne s]]
1441 readLitChar (c:s) = [(c,s)]
1443 showLitChar :: Char -> ShowS
1444 showLitChar c | c > '\DEL' = showChar '\\' .
1445 protectEsc isDigit (shows (fromEnum c))
1446 showLitChar '\DEL' = showString "\\DEL"
1447 showLitChar '\\' = showString "\\\\"
1448 showLitChar c | c >= ' ' = showChar c
1449 showLitChar '\a' = showString "\\a"
1450 showLitChar '\b' = showString "\\b"
1451 showLitChar '\f' = showString "\\f"
1452 showLitChar '\n' = showString "\\n"
1453 showLitChar '\r' = showString "\\r"
1454 showLitChar '\t' = showString "\\t"
1455 showLitChar '\v' = showString "\\v"
1456 showLitChar '\SO' = protectEsc ('H'==) (showString "\\SO")
1457 showLitChar c = showString ('\\' : snd (asciiTab!!fromEnum c))
1459 protectEsc p f = f . cont
1460 where cont s@(c:_) | p c = "\\&" ++ s
1463 -- Unsigned readers for various bases
1464 readDec, readOct, readHex :: Integral a => ReadS a
1465 readDec = readInt 10 isDigit (\d -> fromEnum d - fromEnum '0')
1466 readOct = readInt 8 isOctDigit (\d -> fromEnum d - fromEnum '0')
1467 readHex = readInt 16 isHexDigit hex
1468 where hex d = fromEnum d -
1471 else fromEnum (if isUpper d then 'A' else 'a') - 10)
1473 -- readInt reads a string of digits using an arbitrary base.
1474 -- Leading minus signs must be handled elsewhere.
1476 readInt :: Integral a => a -> (Char -> Bool) -> (Char -> Int) -> ReadS a
1477 readInt radix isDig digToInt s =
1478 [(foldl1 (\n d -> n * radix + d) (map (fromIntegral . digToInt) ds), r)
1479 | (ds,r) <- nonnull isDig s ]
1481 -- showInt is used for positive numbers only
1482 showInt :: Integral a => a -> ShowS
1485 = error "Numeric.showInt: can't show negative numbers"
1488 = let (n',d) = quotRem n 10
1489 r' = toEnum (fromEnum '0' + fromIntegral d) : r
1490 in if n' == 0 then r' else showInt n' r'
1492 = case quotRem n 10 of { (n',d) ->
1493 let r' = toEnum (fromEnum '0' + fromIntegral d) : r
1494 in if n' == 0 then r' else showInt n' r'
1498 readSigned:: Real a => ReadS a -> ReadS a
1499 readSigned readPos = readParen False read'
1500 where read' r = read'' r ++
1501 [(-x,t) | ("-",s) <- lex r,
1503 read'' r = [(n,s) | (str,s) <- lex r,
1504 (n,"") <- readPos str]
1506 showSigned :: Real a => (a -> ShowS) -> Int -> a -> ShowS
1507 showSigned showPos p x = if x < 0 then showParen (p > 6)
1508 (showChar '-' . showPos (-x))
1511 readFloat :: RealFloat a => ReadS a
1512 readFloat r = [(fromRational ((n%1)*10^^(k-d)),t) | (n,d,s) <- readFix r,
1514 where readFix r = [(read (ds++ds'), length ds', t)
1515 | (ds, s) <- lexDigits r
1516 , (ds',t) <- lexFrac s ]
1518 lexFrac ('.':s) = lexDigits s
1519 lexFrac s = [("",s)]
1521 readExp (e:s) | e `elem` "eE" = readExp' s
1524 readExp' ('-':s) = [(-k,t) | (k,t) <- readDec s]
1525 readExp' ('+':s) = readDec s
1526 readExp' s = readDec s
1529 -- Hooks for primitives: -----------------------------------------------------
1530 -- Do not mess with these!
1532 primCompAux :: Ord a => a -> a -> Ordering -> Ordering
1533 primCompAux x y o = case compare x y of EQ -> o; LT -> LT; GT -> GT
1535 primPmInt :: Num a => Int -> a -> Bool
1536 primPmInt n x = fromInt n == x
1538 primPmInteger :: Num a => Integer -> a -> Bool
1539 primPmInteger n x = fromInteger n == x
1541 primPmFlt :: Fractional a => Double -> a -> Bool
1542 primPmFlt n x = fromDouble n == x
1544 -- ToDo: make the message more informative.
1546 primPmFail = error "Pattern Match Failure"
1548 -- used in desugaring Foreign functions
1549 primMkIO :: (RealWorld -> (a,RealWorld)) -> IO a
1552 primCreateAdjThunk :: (a -> b) -> String -> IO Addr
1553 primCreateAdjThunk fun typestr
1554 = do sp <- makeStablePtr fun
1555 p <- copy_String_to_cstring typestr -- is never freed
1556 a <- primCreateAdjThunkARCH sp p
1559 -- The following primitives are only needed if (n+k) patterns are enabled:
1560 primPmNpk :: Integral a => Int -> a -> Maybe a
1561 primPmNpk n x = if n'<=x then Just (x-n') else Nothing
1562 where n' = fromInt n
1564 primPmSub :: Integral a => Int -> a -> a
1565 primPmSub n x = x - fromInt n
1567 -- Unpack strings generated by the Hugs code generator.
1568 -- Strings can contain \0 provided they're coded right.
1570 -- ToDo: change this (and Hugs code generator) to use ByteArrays
1572 primUnpackString :: Addr -> String
1573 primUnpackString a = unpack 0
1575 -- The following decoding is based on evalString in the old machine.c
1578 | c == '\\' = if '\\' == primIndexCharOffAddr a (i+1)
1579 then '\\' : unpack (i+2)
1580 else '\0' : unpack (i+2)
1581 | otherwise = c : unpack (i+1)
1583 c = primIndexCharOffAddr a i
1586 -- Monadic I/O: --------------------------------------------------------------
1588 type FilePath = String
1590 --data IOError = ...
1591 --instance Eq IOError ...
1592 --instance Show IOError ...
1594 data IOError = IOError String
1595 instance Show IOError where
1596 showsPrec _ (IOError s) = showString ("I/O error: " ++ s)
1598 ioError :: IOError -> IO a
1599 ioError (IOError s) = primRaise (IOExcept s)
1601 userError :: String -> IOError
1602 userError s = primRaise (ErrorCall s)
1604 catch :: IO a -> (IOError -> IO a) -> IO a
1606 = ST (\s -> unST m s `primCatch` \ err -> unST (k (e2ioe err)) s)
1608 e2ioe (IOExcept s) = IOError s
1609 e2ioe other = IOError (show other)
1611 putChar :: Char -> IO ()
1612 putChar c = nh_stdout >>= \h -> nh_write h (primCharToInt c)
1614 putStr :: String -> IO ()
1615 putStr s = --mapM_ putChar s -- correct, but slow
1617 let loop [] = return ()
1618 loop (c:cs) = nh_write h (primCharToInt c) >> loop cs
1621 putStrLn :: String -> IO ()
1622 putStrLn s = do { putStr s; putChar '\n' }
1624 print :: Show a => a -> IO ()
1625 print = putStrLn . show
1628 getChar = unsafeInterleaveIO (
1630 nh_read h >>= \ci ->
1631 return (primIntToChar ci)
1634 getLine :: IO String
1635 getLine = do c <- getChar
1636 if c=='\n' then return ""
1637 else do cs <- getLine
1640 getContents :: IO String
1641 getContents = nh_stdin >>= \h -> readfromhandle h
1643 interact :: (String -> String) -> IO ()
1644 interact f = getContents >>= (putStr . f)
1646 readFile :: FilePath -> IO String
1648 = copy_String_to_cstring fname >>= \ptr ->
1649 nh_open ptr 0 >>= \h ->
1651 nh_errno >>= \errno ->
1652 if (h == 0 || errno /= 0)
1653 then (ioError.IOError) ("readFile: can't open file " ++ fname)
1654 else readfromhandle h
1656 writeFile :: FilePath -> String -> IO ()
1657 writeFile fname contents
1658 = copy_String_to_cstring fname >>= \ptr ->
1659 nh_open ptr 1 >>= \h ->
1661 nh_errno >>= \errno ->
1662 if (h == 0 || errno /= 0)
1663 then (ioError.IOError) ("writeFile: can't create file " ++ fname)
1664 else writetohandle fname h contents
1666 appendFile :: FilePath -> String -> IO ()
1667 appendFile fname contents
1668 = copy_String_to_cstring fname >>= \ptr ->
1669 nh_open ptr 2 >>= \h ->
1671 nh_errno >>= \errno ->
1672 if (h == 0 || errno /= 0)
1673 then (ioError.IOError) ("appendFile: can't open file " ++ fname)
1674 else writetohandle fname h contents
1677 -- raises an exception instead of an error
1678 readIO :: Read a => String -> IO a
1679 readIO s = case [x | (x,t) <- reads s, ("","") <- lex t] of
1681 [] -> ioError (userError "PreludeIO.readIO: no parse")
1682 _ -> ioError (userError
1683 "PreludeIO.readIO: ambiguous parse")
1685 readLn :: Read a => IO a
1686 readLn = do l <- getLine
1691 -- End of Hugs standard prelude ----------------------------------------------
1697 instance Show Exception where
1698 showsPrec _ (ErrorCall s) = showString ("error: " ++ s)
1699 showsPrec _ (IOExcept s) = showString ("I/O error: " ++ s)
1701 data IOResult = IOResult deriving (Show)
1703 type FILE_STAR = Int -- FILE *
1705 foreign import stdcall "nHandle.so" "nh_stdin" nh_stdin :: IO FILE_STAR
1706 foreign import stdcall "nHandle.so" "nh_stdout" nh_stdout :: IO FILE_STAR
1707 foreign import stdcall "nHandle.so" "nh_stderr" nh_stderr :: IO FILE_STAR
1708 foreign import stdcall "nHandle.so" "nh_write" nh_write :: FILE_STAR -> Int -> IO ()
1709 foreign import stdcall "nHandle.so" "nh_read" nh_read :: FILE_STAR -> IO Int
1710 foreign import stdcall "nHandle.so" "nh_open" nh_open :: Addr -> Int -> IO FILE_STAR
1711 foreign import stdcall "nHandle.so" "nh_flush" nh_flush :: FILE_STAR -> IO ()
1712 foreign import stdcall "nHandle.so" "nh_close" nh_close :: FILE_STAR -> IO ()
1713 foreign import stdcall "nHandle.so" "nh_errno" nh_errno :: IO Int
1715 foreign import stdcall "nHandle.so" "nh_malloc" nh_malloc :: Int -> IO Addr
1716 foreign import stdcall "nHandle.so" "nh_free" nh_free :: Addr -> IO ()
1717 foreign import stdcall "nHandle.so" "nh_store" nh_store :: Addr -> Int -> IO ()
1718 foreign import stdcall "nHandle.so" "nh_load" nh_load :: Addr -> IO Int
1720 foreign import stdcall "nHandle.so" "nh_argc" nh_argc :: IO Int
1721 foreign import stdcall "nHandle.so" "nh_argvb" nh_argvb :: Int -> Int -> IO Int
1722 foreign import stdcall "nHandle.so" "nh_getenv" nh_getenv :: Addr -> IO Addr
1724 copy_String_to_cstring :: String -> IO Addr
1725 copy_String_to_cstring s
1726 = nh_malloc (1 + length s) >>= \ptr0 ->
1727 let loop ptr [] = nh_store ptr 0 >> return ptr0
1728 loop ptr (c:cs) = nh_store ptr (primCharToInt c) >> loop (incAddr ptr) cs
1731 then error "copy_String_to_cstring: malloc failed"
1734 copy_cstring_to_String :: Addr -> IO String
1735 copy_cstring_to_String ptr
1736 = nh_load ptr >>= \ci ->
1739 else copy_cstring_to_String (incAddr ptr) >>= \cs ->
1740 return ((primIntToChar ci) : cs)
1742 readfromhandle :: FILE_STAR -> IO String
1744 = unsafeInterleaveIO (
1745 nh_read h >>= \ci ->
1746 if ci == -1 {-EOF-} then return "" else
1747 readfromhandle h >>= \restOfFile -> return ((primIntToChar ci) : restOfFile)
1750 writetohandle :: String -> FILE_STAR -> String -> IO ()
1751 writetohandle fname h []
1753 nh_errno >>= \errno ->
1756 else error ( "writeFile/appendFile: error closing file " ++ fname)
1757 writetohandle fname h (c:cs)
1758 = nh_write h (primCharToInt c) >>
1759 writetohandle fname h cs
1761 primGetRawArgs :: IO [String]
1763 = nh_argc >>= \argc ->
1764 accumulate (map (get_one_arg 0) [0 .. argc-1])
1766 get_one_arg :: Int -> Int -> IO String
1767 get_one_arg offset argno
1768 = nh_argvb argno offset >>= \cb ->
1771 else get_one_arg (offset+1) argno >>= \s ->
1772 return ((primIntToChar cb):s)
1774 primGetEnv :: String -> IO String
1776 = copy_String_to_cstring v >>= \ptr ->
1777 nh_getenv ptr >>= \ptr2 ->
1782 copy_cstring_to_String ptr2 >>= \result ->
1786 ------------------------------------------------------------------------------
1787 -- ST, IO --------------------------------------------------------------------
1788 ------------------------------------------------------------------------------
1790 newtype ST s a = ST (s -> (a,s))
1793 type IO a = ST RealWorld a
1796 --primRunST :: (forall s. ST s a) -> a
1797 primRunST :: ST RealWorld a -> a
1798 primRunST m = fst (unST m theWorld)
1800 theWorld :: RealWorld
1801 theWorld = error "primRunST: entered the RealWorld"
1805 instance Functor (ST s) where
1806 fmap f x = x >>= (return . f)
1808 instance Monad (ST s) where
1809 m >> k = ST (\s -> case unST m s of { (a,s') -> unST k s' })
1810 return x = ST (\s -> (x,s))
1811 m >>= k = ST (\s -> case unST m s of { (a,s') -> unST (k a) s' })
1814 -- used when Hugs invokes top level function
1815 primRunIO :: IO () -> ()
1817 = protect (fst (unST m realWorld))
1819 realWorld = error "primRunIO: entered the RealWorld"
1822 = primCatch comp (\e -> fst (unST (putStr (show e ++ "\n")) realWorld))
1824 trace :: String -> a -> a
1826 = (primRunST (putStr ("trace: " ++ s ++ "\n"))) `seq` x
1828 unsafeInterleaveST :: ST s a -> ST s a
1829 unsafeInterleaveST m = ST (\ s -> (fst (unST m s), s))
1831 unsafeInterleaveIO :: IO a -> IO a
1832 unsafeInterleaveIO = unsafeInterleaveST
1835 ------------------------------------------------------------------------------
1836 -- Word, Addr, StablePtr, Prim*Array -----------------------------------------
1837 ------------------------------------------------------------------------------
1841 nullAddr = primIntToAddr 0
1842 incAddr a = primIntToAddr (1 + primAddrToInt a)
1843 isNullAddr a = 0 == primAddrToInt a
1845 instance Eq Addr where
1849 instance Ord Addr where
1858 instance Eq Word where
1862 instance Ord Word where
1871 makeStablePtr :: a -> IO (StablePtr a)
1872 makeStablePtr = primMakeStablePtr
1873 deRefStablePtr :: StablePtr a -> IO a
1874 deRefStablePtr = primDeRefStablePtr
1875 freeStablePtr :: StablePtr a -> IO ()
1876 freeStablePtr = primFreeStablePtr
1879 data PrimArray a -- immutable arrays with Int indices
1882 data Ref s a -- mutable variables
1883 data PrimMutableArray s a -- mutable arrays with Int indices
1884 data PrimMutableByteArray s
1888 -- showFloat ------------------------------------------------------------------
1890 showEFloat :: (RealFloat a) => Maybe Int -> a -> ShowS
1891 showFFloat :: (RealFloat a) => Maybe Int -> a -> ShowS
1892 showGFloat :: (RealFloat a) => Maybe Int -> a -> ShowS
1893 showFloat :: (RealFloat a) => a -> ShowS
1895 showEFloat d x = showString (formatRealFloat FFExponent d x)
1896 showFFloat d x = showString (formatRealFloat FFFixed d x)
1897 showGFloat d x = showString (formatRealFloat FFGeneric d x)
1898 showFloat = showGFloat Nothing
1900 -- These are the format types. This type is not exported.
1902 data FFFormat = FFExponent | FFFixed | FFGeneric
1904 formatRealFloat :: (RealFloat a) => FFFormat -> Maybe Int -> a -> String
1905 formatRealFloat fmt decs x = s
1909 else if isInfinite x then
1910 if x < 0 then "-Infinity" else "Infinity"
1911 else if x < 0 || isNegativeZero x then
1912 '-' : doFmt fmt (floatToDigits (toInteger base) (-x))
1914 doFmt fmt (floatToDigits (toInteger base) x)
1916 let ds = map intToDigit is
1919 doFmt (if e < 0 || e > 7 then FFExponent else FFFixed)
1926 [d] -> d : ".0e" ++ show (e-1)
1927 d:ds -> d : '.' : ds ++ 'e':show (e-1)
1929 let dec' = max dec 1 in
1931 [0] -> '0':'.':take dec' (repeat '0') ++ "e0"
1933 let (ei, is') = roundTo base (dec'+1) is
1934 d:ds = map intToDigit
1935 (if ei > 0 then init is' else is')
1936 in d:'.':ds ++ "e" ++ show (e-1+ei)
1940 let f 0 s ds = mk0 s ++ "." ++ mk0 ds
1941 f n s "" = f (n-1) (s++"0") ""
1942 f n s (d:ds) = f (n-1) (s++[d]) ds
1947 let dec' = max dec 0 in
1949 let (ei, is') = roundTo base (dec' + e) is
1950 (ls, rs) = splitAt (e+ei) (map intToDigit is')
1951 in (if null ls then "0" else ls) ++
1952 (if null rs then "" else '.' : rs)
1954 let (ei, is') = roundTo base dec'
1955 (replicate (-e) 0 ++ is)
1956 d : ds = map intToDigit
1957 (if ei > 0 then is' else 0:is')
1960 roundTo :: Int -> Int -> [Int] -> (Int, [Int])
1961 roundTo base d is = case f d is of
1963 (1, is) -> (1, 1 : is)
1964 where b2 = base `div` 2
1965 f n [] = (0, replicate n 0)
1966 f 0 (i:_) = (if i >= b2 then 1 else 0, [])
1968 let (c, ds) = f (d-1) is
1970 in if i' == base then (1, 0:ds) else (0, i':ds)
1972 -- Based on "Printing Floating-Point Numbers Quickly and Accurately"
1973 -- by R.G. Burger and R. K. Dybvig, in PLDI 96.
1974 -- This version uses a much slower logarithm estimator. It should be improved.
1976 -- This function returns a list of digits (Ints in [0..base-1]) and an
1979 floatToDigits :: (RealFloat a) => Integer -> a -> ([Int], Int)
1981 floatToDigits _ 0 = ([0], 0)
1982 floatToDigits base x =
1983 let (f0, e0) = decodeFloat x
1984 (minExp0, _) = floatRange x
1987 minExp = minExp0 - p -- the real minimum exponent
1988 -- Haskell requires that f be adjusted so denormalized numbers
1989 -- will have an impossibly low exponent. Adjust for this.
1990 (f, e) = let n = minExp - e0
1991 in if n > 0 then (f0 `div` (b^n), e0+n) else (f0, e0)
1996 if f == b^(p-1) then
1997 (f*be*b*2, 2*b, be*b, b)
2001 if e > minExp && f == b^(p-1) then
2002 (f*b*2, b^(-e+1)*2, b, 1)
2004 (f*2, b^(-e)*2, 1, 1)
2007 if b == 2 && base == 10 then
2008 -- logBase 10 2 is slightly bigger than 3/10 so
2009 -- the following will err on the low side. Ignoring
2010 -- the fraction will make it err even more.
2011 -- Haskell promises that p-1 <= logBase b f < p.
2012 (p - 1 + e0) * 3 `div` 10
2014 ceiling ((log (fromInteger (f+1)) +
2015 fromInt e * log (fromInteger b)) /
2016 log (fromInteger base))
2019 if r + mUp <= expt base n * s then n else fixup (n+1)
2021 if expt base (-n) * (r + mUp) <= s then n
2025 gen ds rn sN mUpN mDnN =
2026 let (dn, rn') = (rn * base) `divMod` sN
2029 in case (rn' < mDnN', rn' + mUpN' > sN) of
2030 (True, False) -> dn : ds
2031 (False, True) -> dn+1 : ds
2032 (True, True) -> if rn' * 2 < sN then dn : ds else dn+1 : ds
2033 (False, False) -> gen (dn:ds) rn' sN mUpN' mDnN'
2036 gen [] r (s * expt base k) mUp mDn
2038 let bk = expt base (-k)
2039 in gen [] (r * bk) s (mUp * bk) (mDn * bk)
2040 in (map toInt (reverse rds), k)
2043 -- Exponentiation with a cache for the most common numbers.
2046 expt :: Integer -> Int -> Integer
2048 if base == 2 && n >= minExpt && n <= maxExpt then
2049 expts !! (n-minExpt)
2054 expts = [2^n | n <- [minExpt .. maxExpt]]