datatype 'label btree = Empty | Node of 'label * 'label btree * 'label btree; fun lower(nil) = nil | lower(c::cs) = (Char.toLower c)::lower(cs); fun strLT(x,y) = implode(lower(explode x)) < implode(lower(explode y)); fun insert lt Empty x = Node(x,Empty,Empty) | insert lt (T as Node(y,left,right)) x = if lt(x,y) then Node(y,(insert lt left x),right) else if lt(y,x) then Node(y,left,(insert lt right x)) else (* x=y *) T; (* do nothing; x was already there *) val t = Node("ML", Node("as", Node("a",Empty,Empty), Node("in",Empty,Empty) ), Node("types",Empty,Empty) ); insert strLT t "function";