fun even i = (i mod 2) = 0; fun odd i = not(even i); fun upto 0 = [] |upto n = (upto (n-1))@[n]; fun pairs e [] = [] |pairs e (h::t) = (e,h)::(pairs e t); fun cp [] y = [] |cp (e::x) y = (pairs e y)@(cp x y); (* Alternatively *) fun cp1 x y = collapse (mapf (map pairs x) y); (* Alternatively, using "iteration" *) fun do_while test body s = if test s then do_while test body (body s) else s; fun do_j (result,i,[]) = (result,i,[]) |do_j (result,i,(j::js)) = (result@[(i,j)],i,js); fun test_j (_,_,js) = not (null js); fun do_i (result,[],js) = (result,[],js) |do_i (result,(i::is),js) = let val (new,_,_) = do_while test_j do_j (result,i,js) in (new,is,js) end; fun test_i (_,is,_) = not (null is); fun cp2 x y = let val (result,_,_) = do_while test_i do_i ([],x,y) in result end;