
The following highorder functions
are wellknown in functional programming and
most FP libraries provide most of them, or equivalents.
fun curry f x y = f(x,y)
and uncurry f(x,y) = f x y
and map f [] = []
 map f (x::xs) = (f x)::(map f xs)
and foldl f z [] = z
 foldl f z (x::xs) = foldl f (f(z,x)) xs
(* BTW the opr, f, is curried in the Haskell version *)
and foldr f z [] = z
 foldr f z (x::xs) = f(z, (foldr f z xs))
val sum = foldl (op +) 0
and product = foldl (op * ) 1;
(* tests *)
val l=[1,2,3,4]; sum l; product l;
(* well known high order fns. LA, CSSE, 22/6/2005 *)

Exercises
 Which of the following are legal, and if so what is the type,
or illegal, and if so why?
 curry curry
 curry uncurry
 uncurry curry
 uncurry uncurry
 Rewrite foldl and foldr
so that parameter f is curried, and rewrite
sum and product to match.

window on the wide world:
SML:
::  cons 
[x1,...]  list 
[ ]  list 
@  append 
fn =>  &lambda . 
:  has type 
Compared


