他の人がすでに述べたように、他の場所で文字列表現が本当に必要ない場合は、ツリーを印刷するだけが最も簡単な方法かもしれません。
open TextIO
datatype btree = leaf | branch of btree * btree
fun print_btree leaf = print "0"
| print_btree (branch (s, t)) =
(print "("; print_btree s; print ", "; print_btree t; print ")")
を表す文字列も取得できるようにしたい場合btree
、単純な解決策は次のようになります。
fun btree_to_string leaf = "0"
| btree_to_string (branch (s, t)) =
"(" ^ btree_to_string s ^ ", " ^ btree_to_string t ^ ")"
btree
ただし、大きなs の場合、多くの文字列連結による問題があるため、このバリアントはあまりお勧めしません。
考えておくと良いのは、次のバリアントです。これは、トリック (たとえば、Haskell のShow
クラスでも使用されます) によって連結の問題を回避します。つまり、文字列を処理する代わりに、char リストから char リストへの関数を処理します。次に、連結を関数合成に置き換えることができます
fun btree_to_string' t =
let
fun add s t = s @ t
fun add_btree leaf = add [#"0"]
| add_btree (branch (s, t)) =
add [#"("] o add_btree s o add [#",", #" "] o add_btree t o add [#")"]
in implode (add_btree t []) end