标准ML中的函数参数错误

时间:2014-03-30 19:16:13

标签: sml ml

我正在尝试实现一个使用此数据类型的函数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;

2 个答案:

答案 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)) ,这就是你想要的。