data Nat : Type where Z : Nat S : Nat -> Nat plus : Nat -> Nat -> Nat plus Z y = y plus (S k) y = S (plus k y) data Vect : ? -> Type -> Type where Nil : Vect Z a Cons : a -> Vect k a -> Vect (S k) a record MyDPair a (p : a -> Type) where constructor MkMyDPair dfst : a dsnd : p dfst testPair : MyDPair Nat (\n => Vect n Integer) testPair = MkMyDPair _ (Cons 1 (Cons 2 (Cons 3 Nil))) cons : t -> MyDPair Nat (\n => Vect n t) -> MyDPair Nat (\n => Vect n t) cons val xs = record { dfst = S (dfst xs), dsnd = Cons val (dsnd xs) } xs cons' : t -> MyDPair Nat (\n => Vect n t) -> MyDPair Nat (\n => Vect n t) cons' val xs = record { dfst $= S, dsnd $= Cons val } xs record Stats where constructor MkStats height : Integer weight : Integer record Person where constructor MkPerson name : String age, shoesize : Integer more : Stats testPerson : Person testPerson = MkPerson "Fred" 1337 10 (MkStats 10 10) grow : Person -> Person grow p = record { more->height $= prim__add_Integer 1 } p