Skip to content
  • Ryan Scott's avatar
    Make equality constraints in kinds invisible · cc495d57
    Ryan Scott authored and Ömer Sinan Ağacan's avatar Ömer Sinan Ağacan committed
    Issues #12102 and #15872 revealed something strange about the way GHC
    handles equality constraints in kinds: it treats them as _visible_
    arguments! This causes a litany of strange effects, from strange
    error messages
    (ghc/ghc#12102 (comment 169035))
    to bizarre `Eq#`-related things leaking through to GHCi output, even
    without any special flags enabled.
    
    This patch is an attempt to contain some of this strangeness.
    In particular:
    
    * In `TcHsType.etaExpandAlgTyCon`, we propagate through the
      `AnonArgFlag`s of any `Anon` binders. Previously, we were always
      hard-coding them to `VisArg`, which meant that invisible binders
      (like those whose kinds were equality constraint) would mistakenly
      get flagged as visible.
    * In `ToIface.toIfaceAppArgsX`, we previously assumed that the
      argument to a `FunTy` always corresponding to a `Required`
      argument. We now dispatch on the `FunTy`'s `AnonArgFlag` and map
      `VisArg` to `Required` and `InvisArg` to `Inferred`. As a
      consequence, the iface pretty-printer correctly recognizes that
      equality coercions are inferred arguments, and as a result,
      only displays them in `-fprint-explicit-kinds` is enabled.
    * Speaking of iface pretty-printing, `Anon InvisArg` binders were
      previously being pretty-printed like `T (a :: b ~ c)`, as if they
      were required. This seemed inconsistent with other invisible
      arguments (that are printed like `T @{d}`), so I decided to switch
      this to `T @{a :: b ~ c}`.
    
    Along the way, I also cleaned up a minor inaccuracy in the users'
    guide section for constraints in kinds that was spotted in
    ghc/ghc#12102 (comment 136220).
    
    Fixes #12102 and #15872.
    cc495d57