GHC can't derive instance of polykinded typeclass for newtype that requires a class constraint
GHC chokes when trying to derive the following:
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE PolyKinds #-}
module Example where
class Category (cat :: k -> k -> *) where
catId :: cat a a
catComp :: cat b c -> cat a b -> cat a c
newtype T (c :: * -> * -> *) a b = MkT (c a b) deriving Category
with the following error:
$ /opt/ghc/8.0.1/bin/ghc Example.hs -fprint-explicit-kinds
[1 of 1] Compiling Example ( Example.hs, Example.o )
Example.hs:9:57: error:
• No instance for (Category * c)
arising from the 'deriving' clause of a data type declaration
Possible fix:
use a standalone 'deriving instance' declaration,
so you can specify the instance context yourself
• When deriving the instance for (Category * (T c))
I know what is happening. Unlike in #8865 (closed), where we were deriving Category
for a concrete type like Either
, in the above example we are attempting to derive an instance of the form:
instance Category * c => Category (T * c) where ...
(using -fprint-explicit-kinds
syntax). But validDerivPred
is checking if sizePred (Category * c)
equals the number of free type variables in Category * c
. But note that sizePred
counts both type variables //and// type constructors, and *
is a type constructor! So validDerivPred
erroneously rejects the above instance.
To fix this behavior, I think we just need to change validDerivPred
to only consider the //visible// arguments of Category
(i.e., only c
). This should be a pretty easy fix - patch incoming.
Trac metadata
Trac field | Value |
---|---|
Version | 8.0.1 |
Type | Bug |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | Compiler (Type checker) |
Test case | |
Differential revisions | |
BlockedBy | |
Related | #8865 (closed) |
Blocking | |
CC | |
Operating system | |
Architecture |