type lis = N | C of int * lis

let corec[constructor] plusone l = match l with
  N -> N | C(i, t) -> C(i+1, plusone t)
let r1 = plusone(C(1,N))

let r2 = plusone(N)
let r3 = plusone(C(1,N))
let r4 = plusone(C(3,N))
let r5 = plusone(C(3,C(5,N)))

let rec lis0 = C(1, lis0)
let r6 = plusone(lis0)

let rec lis1 = C(1, C(2, C(3, lis1)))
let r7 = plusone(lis1)

let rec plusonerec l = match l with N -> N | C(i, t) -> C(i+1, plusonerec t)

let r8 = plusonerec(C(3,N))
(* The next line would raise a stack overflow *)
(* let r9 = plusonerec(lis0) *)
