Я пытаюсь реализовать структуру данных Trie в F #.
У меня есть некоторые проблемы.
Я не могу отладить функцию вставки слов. Ни одна из моих точек останова внутри этой функции не достигнута, что-то дает сбой, но я не вижу никакой ошибки.
Также у меня есть серьезные сомнения, правильно ли я все реализовал.
В любом случае вот код:
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. Как я могу заставить функцию insert word возвращать список объектов TrieNode, чтобы мне не пришлось заключать вызов в квадратные скобки ("[", "]"). Я думаю, что это ошибка.
3. Любой другой совет, который вы можете дать мне по реализации этой структуры данных в F #, приветствуется. Я знаю, что, должно быть, я делаю много неправильных вещей, поскольку я очень плохо знаком с этим языком. Например, я знаю, что функция вставки слов некорректна, потому что она не проверяет, пуст ли список или нет, поэтому преждевременно заканчивается. Я хотел пересечь этот мост, когда добрался до него.
Заранее спасибо
Заранее спасибо