2010-11-07 99 views
0

我有这样的代码:SML/ML诠释到字符串转换

datatype 'a Tree = Empty | LEAF of 'a | NODE of ('a Tree) list; 
val iL1a = LEAF 1; 
val iL1b = LEAF 2; 
val iL1c = LEAF 3; 
val iL2a = NODE [iL1a, iL1b, iL1c]; 
val iL2b = NODE [iL1b, iL1c, iL1a]; 
val iL3 = NODE [iL2a, iL2b, iL1a, iL1b]; 
val iL4 = NODE [iL1c, iL1b, iL3]; 
val iL5 = NODE [iL4]; 

fun treeToString f Node = let 
    fun treeFun (Empty) = ["(:"] 
    | treeFun (NODE([])) = [")"] 
    | treeFun (LEAF(v)) = [f v] 
    | treeFun (NODE(h::t)) = [""] @ (treeFun (h)) @ (treeFun (NODE(t))) 
    in 
    String.concat(treeFun Node) 
end; 

treeToString Int.toString iL5; 

当我运行我的功能我得到的输出: “32123)231),12)))”。

答案应该是“((32((123)(231)12)))”。

我试图修改我的函数添加(在每一个地方,我能想到的,但我想不通,我应该加入“(”我在哪里搞砸

编辑:?我相信我需要在某个地方使用map或List.filter,但不知道在哪里。

回答

2

看起来你的方法是通过列表节点的尾部递归来解决问题,而不是将treeFun h追加到treefun (NODE(t)),案例:

treeFun (NODE(items)) = ["("] @ List.concat (map treeFun items) @ [")"] 

即,在节点的整个内容上映射treeFun,并用"("")"围绕结果。这个定义可能是有点过于简洁的让你明白这是怎么回事,所以这里的,你可能会发现更清晰更详细的表格:

| treeFun (NODE(items)) = 
    let val subtree_strings : string list list = map treeFun items 
     val concatenated_subtrees : string list = List.concat subtree_strings 
     in ["("] @ concatenated_subtrees @ [")"] 
     end 

subtree_strings是把所有的子树中给定节点的结果,通过在每个子树上递归调用treeFun将它们中的每一个都转换为字符串列表。由于treeFun每次调用时都会返回一个字符串列表,我们将它调用到整个子树列表上,结果是子树列表的相应列表。例如,如果我们打电话给map treeFun [LEAF 1, LEAF 2, LEAF 3],我们会回到[["1"], ["2"], ["3"]]

这不是我们想要的答案,因为它是一个列表列表的字符串而不是普通字符串列表。我们可以使用List.concat来解决这个问题,该列表包含列表列表,并形成所有基础项目的单个列表。因此,例如List.concat [["1"], ["2"], ["3"]]返回["1", "2", "3"]。现在我们所要做的就是在结果周围放上括号,我们就完成了。

请注意,此策略对于完全空白的节点也同样适用于具有一个或多个子树的节点,因此它不需要原始定义中的第二种情况treeFun。一般来说,在ML中,如果一个参数的函数对于参数类型的每个构造函数都没有确切的一种情况,那么这是一种代码异味。

+0

谢谢你的建议。我意识到我需要映射的东西,但问题是我真的不知道如何在SML中正确映射它。我一直在尝试大约4个小时,但没有真正的教程适合我的情况。我试过“| treeFun(NODE(h :: t))= [”(“] @(map(fn y => y = treeFun(h))[(treeFun(NODE(t)))])@ [“)”]“这样的事情,但得到错误,并尝试了许多其他方法,但卡住了。你可能会贬低我需要做的事情吗?我会继续努力,但任何进一步的建议会帮助我很多。 – user494948 2010-11-08 00:28:30

+0

我已经更新了我的答案,以便更加明确。 – jacobm 2010-11-08 04:41:17

+0

谢谢你的解释,我不知道你可以使用这样的地图功能。这帮助我特别为我创建的另一个功能。 – user494948 2010-11-08 06:22:27

相关问题