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);
{
}