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