Instance resolution regression
The following code works in 7.10, but fails in GHC 8.0.1:
{-# LANGUAGE ConstraintKinds, MultiParamTypeClasses, TypeFamilies,
UndecidableInstances #-}
import GHC.Exts
class Foo a
instance (Foo a, Foo b, CTypeOf a ~ CTypeOf b) => Foo (a,b)
type family TElt r :: Constraint
type instance TElt r = (Foo r, Dispatch (CTypeOf r) r)
type family CTypeOf x where CTypeOf (a,b) = CTypeOf a
class (repr ~ CTypeOf r) => Dispatch repr r
data CT r = CT [r]
toCT :: (Foo r) => CT r -> CT r
toCT = undefined
unzipT :: (TElt a, TElt b, TElt (a,b)) => CT (a,b) -> (CT a, CT b)
unzipT = unzipT . toCT
main :: IO ()
main = undefined
with the errors
Main.hs:1:1: error:
solveWanteds: too many iterations (limit = 4)
Unsolved: WC {wc_simple =
[D] _ :: Dispatch fsk_a3GC b (CDictCan)
[W] hole{a3Hh} :: CTypeOf a ~ CTypeOf b (CNonCanonical)
[D] _ :: fsk_a3GC ~ CTypeOf b (CDictCan)
[D] _ :: fsk_a3GC ~ CTypeOf b (CDictCan)
[D] _ :: fsk_a3GC ~ CTypeOf b (CNonCanonical)}
New superclasses found
Set limit with -fconstraint-solver-iterations=n; n=0 for no limit
Main.hs:22:19: error:
• Couldn't match type ‘CTypeOf a’ with ‘CTypeOf b’
arising from a use of ‘toCT’
NB: ‘CTypeOf’ is a type function, and may not be injective
• In the second argument of ‘(.)’, namely ‘toCT’
In the expression: unzipT . toCT
In an equation for ‘unzipT’: unzipT = unzipT . toCT
• Relevant bindings include
unzipT :: CT (a, b) -> (CT a, CT b) (bound at Main.hs:22:1)
I don't understand the first error at all. The second error seems to be due to calling toCT on the type CT (a,b), which requires the constraint Foo (a,b). Rather than using the supplied constraint from TElt (a,b), GHC is trying to resolve the instance provided, which requires CType a ~ CType b.
Possibly related: #10338, #11948 (closed)
Trac metadata
| Trac field | Value |
|---|---|
| Version | 8.0.1 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Compiler |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture |