如果键是字母,如何为 TRIE 创建 Clojure zipper (由嵌套映射表示)?
类似这样的:
{\b {\a {\n {\a {\n {\a {'$ '$}}}}}} \a {\n {\a {'$ '$}}}}
表示一个包含 2 个单词“banana”和“ana”的 trie。 (如有必要,可以在 map 中进行一些更改..)
我尝试过传递 map ? vals assoc
分别作为 zipper 的 3 个功能。
但似乎不起作用..
我应该使用哪 3 个函数?
基于 zipper 的 insert-into-trie 会是什么样子?
最佳答案
map?
vals
#(zipmap (keys %1) %2)
可以,但不支持插入/删除子项(由于子项只是值,因此您不知道要删除/添加哪个键)。
下面的map-zipper
确实支持插入/删除,因为节点是[k v]对(除了作为映射的根)。
(defn map-zipper [m]
(z/zipper
(fn [x] (or (map? x) (map? (nth x 1))))
(fn [x] (seq (if (map? x) x (nth x 1))))
(fn [x children]
(if (map? x)
(into {} children)
(assoc x 1 (into {} children))))
m))
关于抑制 TRIE 的嵌套 Maps 的 Clojure Zipper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15013458/