2014-03-30 58 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)),這是你想要的。