
Short version: How can I pretty print and parse values of type Double such that those operations are each other's inverse?
Maybe you have more luck with show and read (without Parsec.Token).
Your example: x = 9.91165677454629
fails because the computation performed by the parser 9.0 + 0.91165677454629 yields 9.911656774546291
That seems to do the trick! Below, for the record, the code I've come up with (I threw away the Either Integer Double part so it's a bit simpler, also). I'm sure it can be improved, but this is passing all tests reliably, it seems. Many thanks, Christian and Daniel, for your help! Best, -Andy parseDouble :: Parser Double parseDouble = try $ do (symbol toks) "-" n <- floater return $ negate n <|> floater where toks = makeTokenParser emptyDef -- This could definitely be improved, but it's working. :-) floater :: Parser Double floater = do w <- many1 digit char '.' f <- many1 digit e <- optionMaybe $ do char 'e' -- Optional exponent part n <- option "" (char '-' >> return "-") -- Optional negation in exponent m <- many1 digit return $ n ++ m case e of Nothing -> return $ read $ w ++ "." ++ f Just e' -> return $ read $ w ++ "." ++ f ++ "e" ++ e' -- Andy Gimblett http://gimbo.org.uk/