Быстрый поиск «стандартного мл-три» дает следующие два главных результата:
github.com / cannam / sml-trie , который не является 'написано таким образом, что помогает образовательным целям.Основная часть реализации находится в TrieMapFn
функторе , который параметризует как ключ, так и типы элементов, так что вы можете специализировать это для некоторого числового типа.
github.com / jlao / sml-trie , который представляет собой один файл, который значительно легче переварить.Эта реализация предполагает, что ключи являются строками.Вы можете либо a) адаптировать это, чтобы использовать вместо них числа - в конце концов, это explode
строки, поэтому во внутренних структурах есть просто списки char
, которые также могут быть спискамииз int
- или b) построить оболочку вокруг этого, которая преобразует число (при условии, что ваши числа имеют некоторое каноническое представление строки) в string
перед вставкой и поиском.
Например, если ваши номера были int
:
(* Include jlao/sml-trie here. *)
signature NUMBER_DICT =
sig
type key = int (* concrete *)
type 'a entry = key * 'a (* concrete *)
type 'a dict (* abstract *)
val empty : 'a dict
val lookup : 'a dict -> key -> 'a option
val insert : 'a dict * 'a entry -> 'a dict
val toString : ('a -> string) -> 'a dict -> string
end
structure NumberTrie :> NUMBER_DICT =
struct
type key = int
type 'a entry = key * 'a
type 'a dict = 'a Trie.dict (* a string-based DICT *)
val empty = Trie.empty
fun lookup trie key = Trie.lookup trie (Int.toString key)
fun insert (trie, (key, value)) = Trie.insert (trie, (Int.toString key, value))
val toString = Trie.toString
end
Поскольку DICT в jlao имеет конкретный тип ключа, вы должны сделать новую подпись для каждой структуры, которая изменяет тип ключа,Это не так универсально и предлагает нам преобразовать эту Trie
структуру в функтор, который принимает в качестве параметра тип ключа.Если ваша цель - исследовать построение функторов в модульной системе, это может быть предпочтительнее.