如何为嵌套地图表示的TRIE创建Clojure拉链,键是字母。?
这样的事情:
{\b {\a {\n {\a {\n {\a {'$ '$}}}}}} \a {\n {\a {'$ '$}}}}
表示带有2个单词'banana'和'ana'的trie。 (如果有必要,可以在地图中进行一些更改。)
我试图将map? vals assoc
分别作为3个函数传递给拉链。
但它似乎没有工作..
我应该使用哪3种功能?
基于拉链,insert-into-trie的外观如何?
答案 0 :(得分:14)
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))