嵌套地图的Clojure Zipper压制TRIE

时间:2013-02-21 22:28:42

标签: clojure trie zipper

如何为嵌套地图表示的TRIE创建Clojure拉链,键是字母。?

这样的事情:

{\b {\a {\n {\a {\n {\a {'$ '$}}}}}} \a {\n {\a {'$ '$}}}}

表示带有2个单词'banana'和'ana'的trie。 (如果有必要,可以在地图中进行一些更改。)

我试图将map? vals assoc分别作为3个函数传递给拉链。 但它似乎没有工作..

我应该使用哪3种功能?

基于拉链,insert-into-trie的外观如何?

1 个答案:

答案 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))