module Id; data Nat = Zero | S(Nat); def B iter(f, g)(Nat x) = case x { Zero => g; S(xP) => f(iter(xP)); }; def B compS(f)(Nat z) = f(S(z)); def A id(A y) = y; // type A as function? def Nat iterid(Nat n) = let (A f) = iter(compS, id)(n) in f(Zero); def Nat start(Nat n) = iterid(n); { }