module Foldsum; data Nat = Zero | S(Nat); // Returns a function! def B foldrFun(f,z)(A xs) = case xs { Nil => z; Cons(x,xsP) => f(x, foldrFun(xsP)); }; def Nat plus(Nat x, Nat y) = case x { Zero => y; S(xP) => S(plus(xP, y)); }; // Already defined // let rec map f xs = // match xs with // | Nil -> Nil // | Cons(x,xsP) -> Cons(f x, map f xsP) // ;; def B comp(f, g)(A z) = f (g( z)); def A id(A x) = x; // Error: No higher order constructs possible in abs :-/ def Nat foldsum(List l) = (foldrFun(comp, id)(map(plus, l)))(Zero); { }