我正在尝试将通用二叉树表示为一对。
我将使用SML语法作为示例。这是我的btree类型定义:
datatype btree = leaf | branch of btree*btree;
所以,我想写一个函数,给定一个btree,打印以下内容:
bprint leaf = 0
bprint (branch (leaf,leaf)) = (0,0)
bprint (branch (leaf, branch (leaf,leaf))) = (0, (0, 0))
等等。
问题是这个函数总是返回不同的类型。对于SML而言,这显然是个问题,对于其他功能语言也是如此。
有什么想法吗?
答案 0 :(得分:1)
由于您要做的只是将树结构打印到屏幕上,您可以这样做并让您的函数的返回类型为unit
。这不是试图返回元组(0, (0, 0))
而只是将字符串(0,(0,0))打印到屏幕上。这样你就不会遇到任何类型的困难。
答案 1 :(得分:1)
如果你真的不需要其他地方的字符串表示,正如其他人已经提到的那样,只需打印树就可能是最简单的方法:
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