module ListRev1;
// let comp f g = fun z -> f (g z);;
// def B comp(f,g)() = (A z) => f(g(z)); // Error
def B comp(f,g)(A z) = f(g(z));
// let rev1 l =
// let rec walk = function
// [] -> (fun ys -> ys)
// | x :: xs -> comp (walk xs) (fun ys -> x :: ys)
// in walk l [];;
def A id(A x) = x;
def List walk(List l) =
case l {
Nil => id;
Cons(x,xs) => comp((walk(xs)), ((List ys) => Cons(x, ys)));
}
def List rev1(List l) = walk(l, Nil);
def List start(List l) = rev1(l);
{
}