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 |