我正在尝试实现一个使用此数据类型的函数treeToString:
datatype Tree = LEAF of string | NODE of Tree list;
和这棵树:
val L1a = LEAF "a"
val L1b = LEAF "b"
val L1c = LEAF "c"
val L2a = NODE [L1a, L1b, L1c]
val L2b = NODE [L1b, L1c, L1a]
val L3 = NODE [L2a, L2b, L1a, L1b]
val L4 = NODE [L1c, L1b, L3]
val L5 = NODE [L4]
该函数采用类似treeToString L5
的参数,它将输出字符串((cb((abc)(bca)ab)))
问题是我无法找出区分函数何时采用LEAF或NODE类型的正确方法。我编写下面的代码试图测试这个,但我收到错误。任何人都知道语法,以使其工作?一旦我得到参数,实际的递归应该很容易。
(* treeToString *)
fun treeToString(LEAF str) = str
| treeToString(NODE h::t) =
h;
答案 0 :(得分:1)
这个功能是我以前使用它的功能。只需要在我的参数周围添加括号
fun treeToString f Node = let
fun helperFun (LEAF(v)) = [f v]
| helperFun (NODE(h::t)) = ["("] @ List.concat (map helperFun(h::t)) @ [")"]
in
String.concat(helperFun Node)
end;
答案 1 :(得分:1)
改变这个:
| treeToString(NODE h::t) = ...
对此:
| treeToString (NODE (h::t)) = ...
原因是(NODE h::t)
可以解释为((NODE h)::t)
(其中NODE h
是NODE列表中的第一项)或(NODE (h::t))
,这就是你想要的。