fun printList(L) = let fun length(M) = if (M=nil) then 0 else 1+length(tl(M)); fun printListHelper (0, _, _) = (print "[]\n"; nil) | printListHelper (_, 0, _) = (print "]\n"; nil) | printListHelper (_, _, nil) = (print "[]\n"; nil) (* Can't happen *) | printListHelper (len, left, x::xs) = if(len = left) then (print "["; print (Int.toString(x)); printListHelper(len, left-1, xs)) else (print ", "; print (Int.toString(x)); printListHelper(len, left-1, xs)); val len = length(L); in printListHelper(len, len, L) end; fun halve nil = (nil, nil) | halve [a] = ([a], nil) | halve (a::b::cs) = let val (x, y) = halve cs in (a::x, b::y) end; fun merge (nil, ys) = ys | merge (xs, nil) = xs | merge (x::xs, y::ys) = if (x < y) then x :: merge(xs, y::ys) else y :: merge(x::xs, ys); fun mergeSort nil = (printList([]); nil) | mergeSort [a] = (printList([a]); [a]) | mergeSort theList = let val (x, y) = halve theList in (printList(theList); merge(mergeSort x, mergeSort y)) end;