
#15415: GHCi's :kind doesn't work with wildcards -------------------------------------+------------------------------------- Reporter: goldfire | Owner: (none) Type: bug | Status: new Priority: normal | Milestone: 8.6.1 Component: Compiler | Version: 8.5 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Description changed by goldfire: Old description:
Witness this GHCi session:
{{{ rae:20:35:37 ~/ghc/ghc-head/ghc> ~/ghc/ghc-head/inplace/bin/ghc-stage2 --interactive GHCi, version 8.7.20180716: http://www.haskell.org/ghc/ :? for help Loaded GHCi configuration from /Users/rae/.ghc/ghci.conf Prelude> :set -XPartialTypeSignatures Prelude> import Data.Proxy Prelude Data.Proxy> :k Proxy _ Proxy _ :: * Prelude Data.Proxy> :k Proxy (Maybe :: _)
<interactive>:1:8: error: • Expecting one more argument to ‘Maybe’ Expected kind ‘_’, but ‘Maybe’ has kind ‘* -> *’ • In the first argument of ‘Proxy’, namely ‘(Maybe :: _)’ In the type ‘Proxy (Maybe :: _)’ }}}
It seems we're not doing the correct wildcard thing here: GHCi should report that `_` should be `Type -> Type`.
I believe that this is because `TcHsType.tcWildCardBinders` uses `newSkolemTyVar` internally; `tcWildCardBinders` is called from `TcRnDriver.tcRnType`, which is the implementation of GHCi's `:kind`. This is GHC's only call of `tcWildCardBinders`. All other places use `tcWildCardBindersX newWildTyVar`, which makes vastly more sense.
I would just fix this myself, but it smells intentional. Does anyone know why we have all this?
New description: Witness this GHCi session: {{{ rae:20:35:37 ~/ghc/ghc-head/ghc> ~/ghc/ghc-head/inplace/bin/ghc-stage2 --interactive GHCi, version 8.7.20180716: http://www.haskell.org/ghc/ :? for help Loaded GHCi configuration from /Users/rae/.ghc/ghci.conf Prelude> :set -XPartialTypeSignatures Prelude> import Data.Proxy Prelude Data.Proxy> :k Proxy _ Proxy _ :: * Prelude Data.Proxy> :k Proxy (Maybe :: _) <interactive>:1:8: error: • Expecting one more argument to ‘Maybe’ Expected kind ‘_’, but ‘Maybe’ has kind ‘* -> *’ • In the first argument of ‘Proxy’, namely ‘(Maybe :: _)’ In the type ‘Proxy (Maybe :: _)’ }}} It seems we're not doing the correct wildcard thing here: GHCi should report that `_` should be `Type -> Type`. I believe that this is because `TcHsType.tcWildCardBinders` uses `newSkolemTyVar` internally; `tcWildCardBinders` is called from `TcRnDriver.tcRnType`, which is the implementation of GHCi's `:kind`. This is GHC's only call of `tcWildCardBinders`. All other places use `tcWildCardBindersX newWildTyVar`, which makes vastly more sense. I would just fix this myself, but it smells intentional. Does anyone know why we have all this? (Credit to @int-index who found this bug.) -- -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/15415#comment:1 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler