fun reduce(f,nil,v0) = v0
|reduce(f,a :: x, v0) = f(a,reduce(f,x,v0));

fun sum(nil) = 0
|sum(a :: x) = reduce(op +,a,0) + sum(x);

reduce(op+,map (fn x => reduce(op +,x,0)) [[1,2,3],[4,5],[6,7,8,9]],0);

datatype ttree = nul | node of int * ttree * ttree *ttree;

fun insert(X,nul) = node(X,nul,nul,nul)
|insert(X,node(Y,L,M,R)) =
if X < Y then node(Y,insert(X,L),M,R)
else if X > Y then node(Y,L,M,insert(X,R))
else node(Y,L,insert(X,M),R);

fun insertL(nil,T) = T
|insertL(a::x,T)=insertL(x,insert(a,T));

fun treelist(nul) = nil
|treelist(node(x,L,M,R)) = treelist(L) @ x :: treelist(M) @ treelist(R);

fun printlist(nil) = print("\n")
|printlist(E :: nil) = (print(E : int);print("\n"))
|printlist(E1 :: E2 :: S) = (print(E1);print(" , ");printlist(E2::S));

val indent = 2;

fun tab(Sign, N) = if N> 0 then (print(Sign:string);tab(Sign,N-1)) else nil;

fun printt(nul,N) = it
|printt(node(y,L,M,R),N) = 
(printt(L,N+indent);tab("-",N);print(y);print("\n");printt(M,N+indent);printt(R,N+indent));

fun printtree T = printt(T,0); 

val t1 = node(6,node(1,nul,nul,nul),nul,node(8,nul,nul,nul)); 
val t2= node(6,node(3,node(1,nul,nul,nul),node(3,nul,node(3,nul,nul,nul),node(4,nul,nul,nul)),nul) 
                    ,node(6,nul,nul,nul) 
                    ,node(8,node(7,nul,nul,nul),nul,nul)); 

printtree(t2);
