我对OCaml很陌生,并且很难实现一系列功能来构建T9预测文本程序。例如,如果我的单词是“Dog” - 整数列表将是[3; 6; 4]。我已经有了一个模式匹配函数来将单词与int列表相关联。我正在使用数据类型trie将数字映射到可能的单词结果:
type ('a, 'b) trie = Node of 'b list * ('a * ('a, 'b) trie) list
带有标有“a”类型键的节点和标有“b
类型单词列表的节点”的trie我需要编写一个带参数trie和edge label的函数,它在边缘的末尾返回一个trie。
val trie_of_key : (’a, ’b) trie -> ’a -> (’a, ’b) trie = <fun>
如何遍历边缘以到达给定节点?功能编程对我来说仍然令人迷惑,所以我不确定达到预期子系统所需的递归步骤。
答案 0 :(得分:1)
在我看来,如果你不想修改特里,那么函数编程就像普通的旧命令式编程一样。在此过程中不进行任何重组的查找功能应该非常简单。也许你只是过度思考这个问题?
如果没有看到您尝试过的例子,很难说更多。
<强>更新强>
这是我刚为B-Tree结构编写的查找函数。你试图解决的问题有一些相似之处,所以它可能会给你一些想法。
type ('a, 'b) btree = Node of ('a * 'b) list * ('a, 'b) btree list
let rec lookup bt k =
match bt with
| Node ([], _) -> raise Not_found
| Node (keyvals, subtrees) ->
let rec look kvs sts =
match kvs with
| [] ->
lookup (List.hd sts) k (* Rightmost subtree *)
| (hdk, hdv) :: tlkv ->
if hdk = k then hdv
else if hdk < k then look tlkv (List.tl sts)
else lookup (List.hd sts) k
in
look keyvals subtrees
我不认为细节很重要,但如果您仔细尝试理解代码,那么它基于不变量,即没有键/值对的节点是叶子节点没有子树。否则,如果节点中有n个键/值对,则确实有n + 1个子树。 (这些子树可以是空的。)