在OCaml-T9预测文本实现中按边查找子trie

在OCaml-T9预测文本实现中按边查找子trie,ocaml,trie,t9,Ocaml,Trie,T9,我对OCaml非常陌生,很难实现构建T9预测文本程序的一系列功能。例如,如果我的单词是“Dog”,那么整数列表将是[3;6;4]。我已经有了一个模式匹配函数,可以将单词与int列表关联起来。我使用数据类型trie将数字映射到可能的单词: type('a,'b)trie=b列表*('a*('a,'b)trie)列表的节点 一个trie,其边用“A”类型的键标记,节点用“b”类型的单词列表标记 我需要编写一个带有参数trie和edge label的函数,该函数在边的末尾返回一个trie val tr

我对OCaml非常陌生,很难实现构建T9预测文本程序的一系列功能。例如,如果我的单词是“Dog”,那么整数列表将是[3;6;4]。我已经有了一个模式匹配函数,可以将单词与int列表关联起来。我使用数据类型trie将数字映射到可能的单词:

type('a,'b)trie=b列表*('a*('a,'b)trie)列表的节点

一个trie,其边用“A”类型的键标记,节点用“b”类型的单词列表标记

我需要编写一个带有参数trie和edge label的函数,该函数在边的末尾返回一个trie

val trie\u的键:('a,'b)trie->'a->('a,'b)trie=


如何遍历边以到达给定节点?函数式编程仍然让我迷失方向,因此我不确定达到预期子trie所需的递归步骤。

在我看来,如果您不想修改trie,函数式编程与常规的旧命令式编程是一样的。一个不进行任何重构的查找函数应该非常简单。也许你只是想得太多了

如果没有看到一个你尝试过的例子,很难说得更多

更新

这是我刚刚为B树结构编写的查找函数。你试图解决的问题有一些相似之处,所以它可能会给你一些想法

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
type('a,'b)btree=('a*'b)列表*('a,'b)btree列表的节点
让rec查找btk=
匹配
|未找到节点([],\)->raise
|节点(键值、子树)->
让rec查看kvs sts=
将kvs与
| [] ->
查找(List.hd sts)k(*最右边的子树*)
|(hdk,hdv)::tlkv->
如果hdk=k,则为hdv
否则,如果hdk

我认为细节并不重要,但如果您试图仔细理解代码,它是基于一个不变量,即没有键/值对的节点是没有子树的叶节点。否则,如果节点中有n个键/值对,则正好有n+1个子树。(这些子树可以是空的。)

在这种情况下,命令式查找函数如何工作?我有一个函数
let branchs trie=match trie with Node(u,branchs)->branchs
返回边标签的关联列表,还有一个函数返回关联列表中给定键的值。看起来您已经拥有了所需的一切。有没有可能你只是在处理递归?如果是这样,可以编写一个简单的树查找来预热。然后转到trie,如果需要更多帮助,请向我们显示失败的查找代码。我不想提供代码,因为这看起来像是学校作业。是的,这是一个更大的学校作业的一部分。递归是我的弱点。我确实是从我们之前在类中定义的一些更简单的树查找开始的。如果我找到了解决方案/取得了进展,我会向您汇报。也许发布一些与此问题相关的现有代码可能会更好。将帮助我们进一步帮助