如果您真的不需要其他任何地方的字符串表示,正如其他人已经提到的那样,只需打印树可能是最简单的方法:
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 ")")
如果您还希望能够获得一个表示 a 的字符串btree
,那么简单的解决方案是:
fun btree_to_string leaf = "0"
| btree_to_string (branch (s, t)) =
"(" ^ btree_to_string s ^ ", " ^ btree_to_string t ^ ")"
但是,我并不真正推荐这种变体,因为对于 big 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