Make the Read instance for Proxy (and friends) ignore precedence
authorRyan Scott <ryan.gl.scott@gmail.com>
Tue, 22 Aug 2017 13:29:07 +0000 (09:29 -0400)
committerRyan Scott <ryan.gl.scott@gmail.com>
Tue, 22 Aug 2017 13:29:07 +0000 (09:29 -0400)
commit8fd959998e900dffdb7f752fcd42df7aaedeae6e
treecddc1e31d91e2a0b1aa6f4a020a6fddd7578f84b
parent8476097609a2044e965157380aeb5d4882a71248
Make the Read instance for Proxy (and friends) ignore precedence

Summary:
The `Read` instance for `Proxy`, as well as a handful of other data
types in `base` which only have a single constructor, are doing something
skeevy: they're requiring that they be surrounded by parentheses if the parsing
precedence is sufficiently high. This means that `"Thing (Proxy)"` would parse,
but not `"Thing Proxy"`. But the latter really ought to parse, since there's no
need to surround a single constructor with parentheses. Indeed, that's the
output of `show (Thing Proxy)`, so the current `Read` instance for `Proxy`
violates `read . show = id`.

The simple solution is to change `readParen (d > 10)` to `readParen False` in
the `Read` instance for `Proxy`. But given that a derived `Read` instance would
essentially accomplish the same thing, but with even fewer characters, I've
opted to just replace the hand-rolled `Read` instance with a derived one.

Test Plan: make test TEST=T12874

Reviewers: ekmett, austin, hvr, goldfire, bgamari

Reviewed By: bgamari

Subscribers: rwbarton, thomie

GHC Trac Issues: #12874

Differential Revision: https://phabricator.haskell.org/D3871
libraries/base/Data/Proxy.hs
libraries/base/Data/Type/Coercion.hs
libraries/base/Data/Type/Equality.hs
libraries/base/GHC/Generics.hs
libraries/base/changelog.md
libraries/base/tests/T12874.hs [new file with mode: 0644]
libraries/base/tests/T12874.stdout [new file with mode: 0644]
libraries/base/tests/all.T