Skip to content

GHCi output of :info (~) gives wrong superclass

Summary

GHCi's :info output for the type equality constraint operator (~) is really misleading.

λ> :info (~)
class (a ~ b) => (~) (a :: k) (b :: k)
        -- Defined in ‘Data.Type.Equality’

According to the output printed here, this appears to be a circular constraint: a ~ b implies a ~ b. And it contradicts the source code for the Data.Type.Equality module, which says:

class a ~~ b => (a :: k) ~ (b :: k)

The documentation for (~~) gives the explanation:

this is printed as ~ unless -fprint-equality-relations is set.

And indeed, if -fprint-equality-relations is set, then :info (~) produces the expected output.

λ> :set -fprint-equality-relations

λ> :info (~)
class (a ~~ b) => (~) (a :: k) (b :: k)
        -- Defined in ‘Data.Type.Equality’

I must confess I don't really understand the rationale for why ~~ is normally printed as ~, so it's possible that my suggestion here is off-base; but it seems to me that in this context (perhaps only in this context) ~~ should be printed as ~~ regardless of how the flags are set.

Steps to reproduce

Open a new GHCi session and type :info (~)

Expected behavior

Print output that begins with the following line:

class (a ~~ b) => (~) (a :: k) (b :: k)

Environment

  • GHC versions tested:
    • 8.6.5
    • 8.8.1
Edited by Chris Martin
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information