我正在尝试在F#中实现一种trie数据结构。 但是我遇到了一些问题。 我无法调试单词插入函数,该函数内部的任何断点都没有被触发,但是程序崩溃了,我看不到任何错误信息。 同时,我对自己是否正确地实现了这个东西非常怀疑。 以下是代码:
type TrieNode =
| SubNodes of char * bool * TrieNode list
| Nil
member this.Char = match this with | Nil -> ' '
| SubNodes(c,weh,subnodes) -> c
member this.GetChild(c:char) = match this with | Nil -> []
| SubNodes(c,weh,subnodes) ->[ (List.filter(fun (this:TrieNode) -> this.Char = c) subnodes).Head ]
member this.AWordEndsHere = match this with | Nil -> false
| SubNodes(c,weh,subnodes) -> weh
module TrieFunctions =
let rec insertWord (wordChars:char list) = function
| Nil -> SubNodes(wordChars.Head, false, [])
| SubNodes(c, weh, subnodes) as node ->
let child = node.GetChild(wordChars.Head)
if child = [] then
SubNodes(wordChars.Head,false,[insertWord wordChars.Tail node])
else
SubNodes(wordChars.Head,false,[insertWord wordChars.Tail child.Head])
type Trie(inner : TrieNode) =
member this.InsertWord(wordChars:char list) = TrieFunctions.insertWord(wordChars)
let trie = Trie(SubNodes(' ',false,List.empty)).InsertWord(['g';'i';'g';'i'])
所以我的问题是:
1. 如何获得insertWord函数的调试访问权限?为什么我现在没有得到它?为什么我没有看到错误?
2. 如何使insertWord函数返回TrieNode对象列表,这样我就不必将调用包装在方括号(“[”,“]”)中。我认为这是一个错误。
3. 如果您对在F#中实现此数据结构有任何其他建议,欢迎提出。我知道我一定做错了很多事情,因为我对这种语言非常陌生。例如,我知道单词插入函数存在缺陷,因为它没有检查列表是否为空,所以它会过早地结束。我想在到达目的地时解决这个问题。
谢谢您的帮助