summaryrefslogtreecommitdiff
path: root/testsuite/tests/overloadedrecflds/should_run/overloadedrecfldsrun05.hs
blob: 41f8ae188893ea02cc209e522315c3e087ac1c13 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
{-# LANGUAGE OverloadedRecordFields, DataKinds, PolyKinds, GADTs,
             StandaloneDeriving, TypeFamilies, UndecidableInstances,
             MagicHash #-}

import GHC.Prim (Proxy#, proxy#)
import GHC.Records

data T (a :: x -> *)(b :: x) :: * where
  MkT :: a b -> T a b

deriving instance Show (a b) => Show (T a b)

data U (a :: x -> *)(b :: x)(c :: y -> *)(d :: y)
  = MkU { bar :: T a b, baz :: T c d }
  deriving Show

data V (a :: x -> *)(b :: x)(c :: x -> *)(d :: x)
  = MkV { bar :: T a b, baz :: T c d }
  deriving Show

data F (f :: * -> *) = MkF
  deriving Show

-- Updates to fields of U may change kinds:
-- x :: U F f [] Bool
x = setField (proxy# :: Proxy# "bar") (MkU (MkT [3]) (MkT [False])) (MkT MkF)

-- Updates to fields of V may not, but may change types:
-- y :: V Maybe Int [] Bool
y = setField (proxy# :: Proxy# "bar") (MkV (MkT [3]) (MkT [False])) (MkT (Just 6))


main = do  print x
           print y