[GHC] #9090: Untouchable higher-kinded type variable in connection with RankNTypes, ConstraintKinds and TypeFamilies
GHC
ghc-devs at haskell.org
Thu May 8 18:25:37 UTC 2014
#9090: Untouchable higher-kinded type variable in connection with RankNTypes,
ConstraintKinds and TypeFamilies
-------------------------------------+-------------------------------------
Reporter: kosmikus | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler (Type | Version: 7.8.2
checker) | Operating System: Unknown/Multiple
Keywords: | Type of failure: GHC rejects
Architecture: Unknown/Multiple | valid program
Difficulty: Unknown | Test Case:
Blocked By: | Blocking:
Related Tickets: |
-------------------------------------+-------------------------------------
I have the following module
{{{
{-# LANGUAGE RankNTypes, ConstraintKinds, TypeFamilies #-}
import GHC.Exts (Constraint)
type family D (c :: Constraint) :: Constraint
type instance D (Eq a) = Eq a
-- checks
f :: Eq b => (forall a. D (Eq a) => f a -> Bool) -> f b -> Bool
f g x = g x
-- checks
f' :: Eq b => (forall a. Eq a => f a -> Bool) -> f b -> Bool
f' = f
-- checks, so GHC seems to think that both types are interchangeable
f'' :: Eq b => (forall a. D (Eq a) => f a -> Bool) -> f b -> Bool
f'' = f'
-- checks
test' y = f' (\ (Just x) -> x /= x) y
-- fails
test y = f (\ (Just x) -> x /= x) y
-- fails too, unsurprisingly
test'' y = f'' (\ (Just x) -> x /= x) y
}}}
The module checks with GHC-7.6.3, but fails in GHC-7.8.2 and
GHC-7.9.20140430 with
{{{
src/Test.hs:24:16:
Couldn't match type ‘f’ with ‘Maybe’
‘f’ is untouchable
inside the constraints (D (Eq a))
bound by a type expected by the context: (D (Eq a)) => f a -> Bool
at src/Test.hs:24:10-35
‘f’ is a rigid type variable bound by
the inferred type of test :: Eq b => f b -> Bool
at src/Test.hs:24:1
Possible fix: add a type signature for ‘test’
Expected type: f a
Actual type: Maybe a
Relevant bindings include
y :: f b (bound at src/Test.hs:24:6)
test :: f b -> Bool (bound at src/Test.hs:24:1)
In the pattern: Just x
In the first argument of ‘f’, namely ‘(\ (Just x) -> x /= x)’
In the expression: f (\ (Just x) -> x /= x) y
src/Test.hs:27:20:
Couldn't match type ‘f’ with ‘Maybe’
‘f’ is untouchable
inside the constraints (D (Eq a))
bound by a type expected by the context: (D (Eq a)) => f a -> Bool
at src/Test.hs:27:12-39
‘f’ is a rigid type variable bound by
the inferred type of test'' :: Eq b => f b -> Bool
at src/Test.hs:27:1
Possible fix: add a type signature for ‘test''’
Expected type: f a
Actual type: Maybe a
Relevant bindings include
y :: f b (bound at src/Test.hs:27:8)
test'' :: f b -> Bool (bound at src/Test.hs:27:1)
In the pattern: Just x
In the first argument of ‘f''’, namely ‘(\ (Just x) -> x /= x)’
In the expression: f'' (\ (Just x) -> x /= x) y
}}}
I'd expect it to typecheck.
At first, I thought this might be related in some way to #8985. That's why
I tested with HEAD, but while #8985 seems indeed to be fixed, this is
still a problem there.
Also, while my simplified test case compiles with GHC-7.6.3, my original
more complicated program does not, so there might be another report
forthcoming if I manage to isolate the difference.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/9090>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list