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-kinds
you don't see the kinds on the types at all. - Without
-XPolyKinds
in GHCi, when you say:t foo
you are asking for the type of the expressionfoo
(it could be an arbitrary expression). Sofoo
is instantiated and then re-generalised; but without-XPolyKinds
we don't get a poly-kinded type. Hence the difference in what is printed by:type
and: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 |