9

キーが文字である場合、ネストされたマップで表される TRIE 用の Clojure ジッパーを作成するにはどうすればよいですか?

このようなもの:

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

「バナナ」と「アナ」の2語でトライを表現。(必要に応じて、ここでマップを変更することができます..)

map? vals assoc3つの機能をジッパーにそれぞれ渡してみました。しかし、それはうまくいかないようです..

どの 3 つの機能を使用する必要がありますか?

そして、ジッパーに基づいて、インサートイントゥトライはどのように見えるでしょうか?

4

2 に答える 2

16

map? vals #(zipmap (keys %1) %2)可能ですが、子の挿入/削除はサポートしていません (子は単なる値であるため、どのキーを削除/追加するかわかりません)。

以下は、map-zipperノードが [kv] ペアであるため、挿入/削除をサポートします (マップであるルートを除く)。

(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))
于 2013-02-22T09:21:07.150 に答える