data List a = { Nil, Cons a (List a) } defn map f l = { case l of { Nil -> { Nil } Cons x xs -> { Cons (f x) (map f xs) } } } defn foldl f b l = { case l of { Nil -> { b } Cons x xs -> { foldl f (f b x) xs } } } defn foldr f b l = { case l of { Nil -> { b } Cons x xs -> { f x (foldr f b xs) } } } defn list = { Cons 1 (Cons 2 (Cons 3 (Cons 4 Nil))) } defn add x y = { x + y } defn sum l = { foldr add 0 l } defn skipAdd x y = { y + 1 } defn length l = { foldr skipAdd 0 l } defn main = { sum list + length list }