Make `read . show = id` for Data.Fixed (fix #9240)
authorBrian McKenna <brian@brianmckenna.org>
Tue, 2 Dec 2014 16:53:38 +0000 (17:53 +0100)
committerHerbert Valerio Riedel <hvr@gnu.org>
Tue, 2 Dec 2014 16:54:50 +0000 (17:54 +0100)
commit7c38e985aa211ca44039c6d1db9fa13690749c59
tree1c97a63cd1e023644bc97c8144ed348dab6dffb9
parent6b063ef2a1f68290b51778a38e9b89b6fec5e170
Make `read . show = id` for Data.Fixed (fix #9240)

The QuickCheck property now succeeds:

    prop :: Fixed B7 -> Bool
    prop a = read (show a) == a

This changes the Show instance for Fixed to round up, rather than down
when calculating a digit. This needs to happen because Read also
rounds down:

    data B7

    instance HasResolution B7 where
      resolution _ = 128

    1 / 128 = 0.0078125

    read "0.007" = (0.000 :: Fixed B7)

Here is an example of the change to Show:

    showFixed False (0.009 :: Fixed B7)

    -- Broken: "0.007"
    -- Fixed:  "0.008"

And now Read can continue to round down:

    read "0.008" = (0.0078125 :: Fixed B7)

Reviewed By: hvr, ekmett

Differential Revision: https://phabricator.haskell.org/D547
libraries/base/Data/Fixed.hs
libraries/base/changelog.md
libraries/base/tests/data-fixed-show-read.hs
libraries/base/tests/data-fixed-show-read.stdout