inference with functional dependencies
Avi Pfeffer
avi@eecs.harvard.edu
Mon, 13 Aug 2001 18:08:08 -0400 (EDT)
Inferring equality between types when there are functional dependencies
seems to be less powerful than I expected. Here's a simple example:
class Eq b => C a b | a -> b
data T a = forall b . C a b => T b
data U a = forall b . C a b => U b
compare :: T a -> U a -> Bool
compare (T x) (U y) = x == y
I expected the compiler (GHC) would be able to deduce that the b type in
the representation of T a and U a must be the same, since both stand in a
C a b relationship, and a functionally determines b in that
relationship. Instead I get the message:
Inferred type is less polymorphic than expected
Quantified type variable `b1' is unified with `b'
When checking a pattern that binds
x :: b
y :: b1
In an equation for function `Test.compare':
Test.compare (T x) (U y) = x == y
Is this expected behavior? Is there a way for me to provide the necessary
hints so that code like this could be accepted?
Thanks,
Avi Pfeffer
--
Avi Pfeffer avi@eecs.harvard.edu www.eecs.harvard.edu/~avi
Maxwell Dworkin 251
Division of Engineering and Applied Sciences Tel: (617) 496-1876
Harvard University Fax: (617) 496-1066