import PrelErr ( error )
import PrelEnum ( Enum(..) )
import PrelNum
-import PrelNumExtra
+import PrelReal
+import PrelFloat
import PrelList
import PrelTup
import PrelMaybe
import PrelShow -- isAlpha etc
import PrelBase
-import Monad
-- needed for readIO and instance Read Buffermode
import PrelIOBase ( IO, userError, BufferMode(..) )
readList = readList__ reads
\end{code}
+In this module we treat [(a,String)] as a monad in MonadPlus
+But MonadPlus isn't defined yet, so we simply give local
+declarations for mzero and guard suitable for this particular
+type. It would also be reasonably to move MonadPlus to PrelBase
+along with Monad and Functor, but that seems overkill for one
+example
+
+\begin{code}
+mzero :: [a]
+mzero = []
+
+guard :: Bool -> [()]
+guard True = [()]
+guard False = []
+\end{code}
+
%*********************************************************
%* *
\subsection{Utility functions}
(nam,t) <- return (span isIdChar s)
return (c:nam, t)
| isDigit c = do
+{- Removed, 13/03/2000 by SDM.
+ Doesn't work, and not required by Haskell report.
let
(pred, s', isDec) =
case s of
('x':rs) -> (isHexDigit, rs, False)
('X':rs) -> (isHexDigit, rs, False)
_ -> (isDigit, s, True)
-
- (ds,s) <- return (span pred s')
- (fe,t) <- lexFracExp isDec s
+-}
+ (ds,s) <- return (span isDigit s)
+ (fe,t) <- lexFracExp s
return (c:ds++fe,t)
| otherwise = mzero -- bad character
where
isSym c = c `elem` "!@#$%&*+./<=>?\\^|:-~"
isIdChar c = isAlphaNum c || c `elem` "_'"
- lexFracExp True ('.':cs) = do
+ lexFracExp ('.':c:cs) | isDigit c = do
(ds,t) <- lex0Digits cs
(e,u) <- lexExp t
- return ('.':ds++e,u)
- lexFracExp _ s = return ("",s)
+ return ('.':c:ds++e,u)
+ lexFracExp s = return ("",s)
lexExp (e:s) | e `elem` "eE" =
(do