抑制 TRIE 的嵌套 Maps 的 Clojure Zipper

标签 clojure trie zipper

如果键是字母,如何为 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/

相关文章:

clojure - Clojure 中的 macroexpand 和 macroexpand-1 有什么区别

Clojure 使用 Java JsonPath

条件跳转问题

java - 使用尝试自动完成

clojure - 添加到 Clojure 持久矢量图

clojure - 为什么 ASeq 需要一个集合来实现 Sequential 以允许等效?

c - 帮助 Trie 实现

clojure - 如何创建 Clojure zipper

serialization - 序列化 zipper ?