{-# LANGUAGE TypeFamilies, GADTs #-} -- Tests record update in the presence of -- existentials, GADTs, type families module Rec where ----------------- Existential data S a where S1 :: { fs1 :: a, fs2 :: b } -> S a S2 :: { fs1 :: a } -> S a updS s x = s { fs1=x } ------------------ GADT data T a b where T1 :: { ft1 :: a, ft2 :: c, ft3 :: d } -> T a Int T2 :: { ft1 :: a, ft3 :: c } -> T a Int T3 :: T Int b f :: T a1 b -> a2 -> T a2 b f x v = x { ft1 = v } ------------------ Type family data family R a data instance R (a,b) where R1 :: { fr1 :: a, fr2 :: b, fr3 :: c } -> R (a,b) R2 :: { fr1 :: a, fr3 :: c } -> R (a,b) updR r x = r { fr1=x }