module ISortFold; data Nat = Zero | S(Nat); def Bool leq(Nat x, Nat y) = case x { Zero => True; S(xP) => case y { Zero => False; S(yP) => leq(xP,yP); }; }; def List insert(ord)(Nat x, List ys) = case ys { Nil => Cons(x,Nil); Cons(y,ysP) => case ord(x,y) { True => Cons(x,Cons(y,ysP)); False => Cons(y, insert(x,ysP)); }; }; def List fold(f)(Nat z, List xs) = case xs { Nil => z; Cons(x,xsP) => f(x, fold(z, xsP)); }; // Higher order not allowed // def List isort(List ys) = fold(insert(leq))(Nil, ys); // Error insert(leq) def List isort(List ys) = fold((Nat x, Nat y) => insert(leq)(x,y))(Nil, ys); // def List start(List ys) = isort(ys); { }