Odd interaction between record update and type families
Consider the following example
{-# LANGUAGE TypeFamilies #-}
type family F a
type family G a
data T1
type instance F T1 = Char
type instance G T1 = Int
data T2
type instance F T2 = Bool
type instance G T2 = Int
data R a = R { x :: F a, y :: G a }
r1 :: R T1
r1 = R { x = 'a', y = 2 }
r2 :: R T2
r2 = r1 { x = True } -- error: Cannot match T1 with T2
r3 :: R T2
r3 = r1 { x = True, y = y r1 } -- OK
The error for r2
is odd because types R T1
and R T2
differ only in the type of x
, so if we start with a value of type R T1
, and update the field where the types differ, we should end up with a valid value of type R T2
.
The fact that r2
is OK is demonstrated by r3
where we update the other field with its own value, and now the type checker is happy.
Trac metadata
Trac field | Value |
---|---|
Version | 7.10.2 |
Type | Bug |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | Compiler (Type checker) |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | |
Operating system | |
Architecture |