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/

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to