2014-03-30 53 views
0

我想实现使用这种数据类型的函数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; 

回答

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

更改此:

| treeToString(NODE h::t) = ... 

要这样:

| treeToString (NODE (h::t)) = ... 

的原因是(NODE h::t)可以被解释为((NODE h)::t)(其中NODE h是NODE的列表中的第一项)或(NODE (h::t)),这是你想要的。