% ------------------------------------------------------------------------------
-% $Id: Read.lhs,v 1.4 2002/04/11 12:03:44 simonpj Exp $
+% $Id: Read.lhs,v 1.6 2002/04/13 14:59:06 panne Exp $
%
% (c) The University of Glasgow, 1994-2000
%
-- H98 compatibility
lex :: ReadS String -- As defined by H98
-lex = readP_to_S (do { lexeme <- L.lex ;
- return (show lexeme) })
+lex "" = [("","")] -- ugly hack
+lex s = readP_to_S (do { lexeme <- L.lex ;
+ return (show lexeme) }) s
lexLitChar :: ReadS String -- As defined by H98
lexLitChar = readP_to_S (do { lexeme <- L.lexLitChar ;
_ -> pfail
)
+readIEEENumber :: (RealFloat a) => (Number -> Maybe a) -> ReadPrec a
+-- Read a Float/Double.
+readIEEENumber convert =
+ parens
+ ( do x <- lexP
+ case x of
+ Ident "NaN" -> return (0/0)
+ Ident "Infinity" -> return (1/0)
+ Symbol "-" -> do n <- readIEEENumber convert
+ return (negate n)
+
+ Number y -> case convert y of
+ Just n -> return n
+ Nothing -> pfail
+
+ _ -> pfail
+ )
+
instance Read Int where
readPrec = readNumber numberToInt
readListPrec = readListPrecDefault
readList = readListDefault
instance Read Float where
- readPrec = readNumber numberToFloat
+ readPrec = readIEEENumber numberToFloat
readListPrec = readListPrecDefault
readList = readListDefault
instance Read Double where
- readPrec = readNumber numberToDouble
+ readPrec = readIEEENumber numberToDouble
readListPrec = readListPrecDefault
readList = readListDefault