1

先週、ネストされたデータ構造内の特定の要素を更新するために Zippers を使用してアルゴリズムを作成しようとしていました

そこでの私の答えは、その正確な構造の問題を解決し、より多くの要素をネストするとアルゴリズムが壊れます。

ネストされたデータ構造内の特定のデータを更新するために Zippers を使用して一般的なアルゴリズムを作成することは可能ですか? それとも、ジッパーは歩数を正確に把握している場合にのみ使用されますか?

正しくは、Zippers が作成された目的ではない何かを Zippers に実行させようとしていることを理解する必要があります。

4

2 に答える 2

1

この方法でジッパーを使用することは絶対に可能です。選択した任意の方向にジッパーを移動できるからです。例として、必要に応じてノードを変更する機能を備えた、zipper を介した任意の訪問を提供するzip-visit ライブラリを見てください。

ドキュメントから取られた例:

(def s "<div><span id='greeting'>Hello</span> <span id='name'>Mr. Foo</span>!</div>")
(def root (z/xml-zip (xml/parse (java.io.ByteArrayInputStream. (.getBytes s)))))

(defn replace-element [id replacement]
  (visitor :pre [n s]
    (if (= (:id (:attrs n)) id) {:node replacement})))

user=> (pprint (:node (visit root nil [(replace-element "name" "Mr. Smith")])))
{:tag :div,
 :attrs nil,
 :content
 [{:tag :span, :attrs {:id "greeting"}, :content ["Hello"]}
  "Mr. Smith"
  "!"]}

もちろん、単純なウォーキングを使用して同様のタスクを実行することもできます。その例は、この SO question on traversing maps にあります。

于 2015-08-24T20:02:59.123 に答える