{- The purpose of this is to test that record update is sufficiently polymorphic. See comments with tcExpr (RecordUpd) in TcExpr.lhs -} module Main where data T a b c d = MkT1 { op1 :: a, op2 :: b } | MkT2 { op1 :: a, op3 :: c } | MkT3 { op4 :: a, op5 :: d } update1 :: a2 -> T a b c d -> T a2 b c d2 update1 x t = t { op1 = x } -- NB: the MkT3.op4 case doesn't constrain the result because -- it doesn't have an op1 field update2 :: a2 -> T a b c d -> T a2 b2 c2 d update2 x t = t { op4 = x } main = print (op4 $ update2 True $ MkT3 { op4 = op2 $ update1 (1::Int) $ MkT1 { op1 = True } })