在OCaml-T9预测文本实现中通过边缘查找子特征

时间:2014-10-19 16:44:57

标签: ocaml trie t9

我对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>

如何遍历边缘以到达给定节点?功能编程对我来说仍然令人迷惑,所以我不确定达到预期子系统所需的递归步骤。

1 个答案:

答案 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个子树。 (这些子树可以是空的。)