我们将得到一棵类型为
的树type ('nonterminal, 'terminal) parse_tree =
| Node of 'nonterminal * ('nonterminal, 'terminal) parse_tree list
| Leaf of 'terminal
及其形式:
let t = (Node ("+", [Leaf 3; Node ("*", [Leaf 4; Leaf 5])])
然后我们被要求编写一个函数,该函数将一棵树作为参数并返回找到的叶子列表(从左到右的形式),从而留下t = [3; 4; 5]
现在这就是我所拥有的,但是它给了我一个错误,我不确定应该如何解决这个问题:
let rec getleaf tree =
match tree with
|Leaf a -> [a]
| Node (a, Leaf (h)::t) -> h::getleaf t;;
谢谢。
答案 0 :(得分:0)
列表模式h :: t
将h
绑定到列表的开头(单个元素),将t
绑定到列表的末尾(本身就是列表)。因此,代码中的名称t
将与解析树列表匹配。但是getleaf
希望有一个解析树作为其参数。
更新
通常要做的是让getleaf
接受一棵树。在Node
的代码中,您将必须具有任意数量的递归调用,然后将它们组合在一起以产生该节点的结果。
处理多个递归调用的最惯用的方法是折叠(IMHO)。您还可以使用List.map
(这将给出列表列表),然后使用List.concat
返回单个列表。 (IMHO)较容易考虑,但它进行了一些不必要的计算。
您可能要考虑是否需要保持叶子的顺序。