Confusing error messages with PolyKinds and superclasses
This program compiles fine:
{-# LANGUAGE FlexibleInstances #-}
import Data.Typeable
newtype Tagged t v = Tagged v
deriving Typeable
class (Typeable t) => MyClass t where
classF :: t -> Int
instance Typeable t => MyClass (Tagged t Int) where
classF (Tagged n) = n
But if I add PolyKinds to the LANGUAGE pragma I get:
code/junk/typeable-problems.hs:17:10: error:
• Could not deduce (Typeable k)
arising from the superclasses of an instance declaration
from the context: Typeable t
bound by the instance declaration
at code/junk/typeable-problems.hs:17:10-45
• In the instance declaration for ‘MyClass (Tagged t Int)’
|
17 | instance Typeable t => MyClass (Tagged t Int) where
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Which is very confusing since I don't have a k variable anywhere. Adding -fprint-explicit-kinds is somewhat better:
code/junk/typeable-problems.hs:17:10: error:
• Could not deduce (Typeable * k)
arising from the superclasses of an instance declaration
from the context: Typeable k t
bound by the instance declaration
at code/junk/typeable-problems.hs:17:10-45
• In the instance declaration for ‘MyClass (Tagged k t Int)’
|
17 | instance Typeable t => MyClass (Tagged t Int) where
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
But still confusing. It doesn't really point me towards the solution - specifying that the kind of t is * explicitly - if I don't already know how the extension works.
It's also annoying that turning on an extension causes a type error, but I don't know if that's fixable.
Trac metadata
| Trac field | Value |
|---|---|
| Version | 8.2.1 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Compiler |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture |