[GHC] #15039: Bizarre pretty-printing of inferred Coercible constraint in partial type signature

GHC ghc-devs at haskell.org
Fri Apr 20 01:50:28 UTC 2018


#15039: Bizarre pretty-printing of inferred Coercible constraint in partial type
signature
-------------------------------------+-------------------------------------
        Reporter:  RyanGlScott       |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:  8.6.1
       Component:  Compiler (Type    |              Version:  8.4.1
  checker)                           |             Keywords:
      Resolution:                    |  PartialTypeSignatures, TypeInType
Operating System:  Unknown/Multiple  |         Architecture:
 Type of failure:  Poor/confusing    |  Unknown/Multiple
  error message                      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by goldfire):

 The idea is that, with `-fprint-explicit-kinds`, `(a ~~ b)` should be
 printed as `((a :: *) ~~ (b :: *))`, with the explicit kinds. But `(a ~#
 b)` should ''also'' be printed as `((a :: *) ~~ (b :: *))`, so as not to
 expose the user to `~#`. Note that `(a ~ b)` is just printed as `(a ~ b)`,
 even with `-fprint-explicit-kinds`, which seems wrong. And, of course,
 `~R#` should never be printed with `~~`.

 What to do? Here are the cases. Assume `a :: *`, `b :: *`, and `c :: k`.

 1. Homogeneous equality `a ~ b`.

 2. Homogeneous use of heterogeneous equality `a ~~ b`.

 3. Heterogeneous use of heterogeneous equality `a ~~ c`.

 4. Homogeneous use of unlifted equality `a ~# b`.

 5. Heterogeneous use of unlifted equality `a ~# c`.

 6. Homegeneous representational equality `Coercible a b`.

 7. Homogeneous use of representational unlifted equality `a ~#R b`.

 8. Heterogeneous use of representational unlifted equality `a ~R# c`.

 Note that there is no heterogeneous representational lifted equality (the
 counterpert to `~~`). There could be, but there seems to be no use for it.

 For each case, we must decide how to print

 a. By default
 b. With `-fprint-explicit-kinds`
 c. With `-fprint-equality-relations`
 d. With `-fprint-explicit-kinds -fprint-equality-relations`.

 I propose:

 1.
   a. `a ~ b`
   b. `(a :: *) ~ (b :: *)`
   c. `a ~ b`
   d. `(a :: *) ~ (b :: *)`

 2.
   a. `a ~ b`
   b. `(a :: *) ~ (b :: *)`
   c. `a ~~ b`
   d. `(a :: *) ~~ (b :: *)`

 3.
   a. `a ~~ c`
   b. `(a :: *) ~~ (c :: k)`
   c. `a ~~ c`
   d. `(a :: *) ~~ (c :: k)`

 4.
   a. `a ~ b`
   b. `(a :: *) ~ (b :: *)`
   c. `a ~# b`
   d. `(a :: *) ~# (b :: *)`

 5.
   a. `a ~~ c`
   b. `(a :: *) ~~ (c :: k)`
   c. `a ~# c`
   d. `(a :: *) ~# (c :: k)`

 6.
   a. `Coercible a b`
   b. `Coercible * a b`
   c. `Coercible a b`
   d. `Coercible * a b`

 7.
   a. `Coercible a b`
   b. `Coercible * a b`
   c. `a ~R# b`
   d. `(a :: *) ~R# (b :: *)`

 8.
   a. `a ~R# c`
   b. `(a :: *) ~R# (c :: k)`
   c. `a ~R# c`
   d. `(a :: *) ~R# (c :: k)`

 Here are the rules:

 A. With `-fprint-equality-relations`, print the true equality relation.
 B. Without `-fprint-equality-relations`:
    i. If the equality is representational and homogeneous, use
 `Coercible`.
    ii. Otherwise, if the equality is representational, use `~R#`.
    iii. If the equality is nominal and homogeneous, use `~`.
    iv. Otherwise, if the equality is nominal, use `~~`.
 C. With `-fprint-explicit-kinds`, print kinds on both sides of an infix
 operator, as above; or print the kind with `Coercible`.
 D. Without `-fprint-explicit-kinds`, don't print kinds.

 I believe that my examples above conform to these rules.

 Do we agree with this approach?

-- 
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/15039#comment:4>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list