GHC suppresses too much kind information
GHC tends to hide important kind polymorphism in error messages and in GHCi. (I came across this when looking at #9017 (closed).) For example, try this:
bash$ cat Test.hs
{-# LANGUAGE PolyKinds #-}
module Test where
foo :: m a
foo = foo
bash$ ghci Test.hs
ghci> :t foo
foo :: m a
ghci> :i foo
foo :: m a
bash$ ghci Test.hs -XPolyKinds
ghci> :t foo
foo :: m a
ghci> :i foo
goo :: m a
bash$ ghci Test.hs -fprint-explicit-foralls -fprint-explicit-kinds
ghci> :t foo
foo :: foo :: forall (m :: * -> *) d. m d
ghci> :i foo
foo :: forall (k :: BOX) (m :: k -> *) (d :: k). m d
bash$ ghci Test.hs -XPolyKinds -fprint-explicit-foralls -fprint-explicit-kinds
ghci> :t foo
foo :: forall (k :: BOX) (m :: k -> *) (d :: k). m d
ghci> :i foo
foo :: forall (k :: BOX) (m :: k -> *) (d :: k). m d
Pretty confusing eh?
- Without
-fprint-explicit-foralls -fprint-explicit-kindsyou don't see the kinds on the types at all. - Without
-XPolyKindsin GHCi, when you say:t fooyou are asking for the type of the expressionfoo(it could be an arbitrary expression). Sofoois instantiated and then re-generalised; but without-XPolyKindswe don't get a poly-kinded type. Hence the difference in what is printed by:typeand:info.
Here's a proposal: even without -fprint-explicit-foralls, we should print any foralls that bind a type variable whose kind includes a kind variable.
Trac metadata
| Trac field | Value |
|---|---|
| Version | 7.8.2 |
| Type | FeatureRequest |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Compiler |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture |