Nil T = Class Impl := Phantom(T) and Eq Cons T, N = Inherit {head = T; rest = List(T, N-1)} List: (Type, Nat) -> Type List T, 0 = Class Nil T List T, N = Class Cons(T, N), Impl := Eq List. nil T = List(T, 0).new Nil(T).new() cons|T, N| rest: List(T, N-1), head: T = List(T, N).new Cons(T, N)::{head; rest} {nil, cons} = List a = cons(nil(Int), 1) |> cons 2 |> cons 3 match a: Cons(_, _)::{head=h1; rest=Cons(_, _)::{head=h2; rest}} -> assert h1 == 3 assert h2 == 2 assert rest == Cons::{head = 1; rest = nil(Int)} _ -> pass