1

上周,我试图用 Zippers 编写一个算法来更新嵌套数据结构中的特定元素,How to move an element within a structure, possible with zippers?

我的答案解决了该确切结构的问题,嵌套更多元素会破坏算法。

这让人想到,是否有可能用 Zippers 编写一个通用算法来更新嵌套数据结构中的特定数据(无论它是多么嵌套)?或者只有当您确切地知道您的步数时,才会使用拉链?

我需要理解这一点,正确地我试图让 Zippers 做一些不是 Zippers 被创建的事情。

4

2 回答 2

1

绝对可以以这种方式使用拉链,因为您可以在您选择的任何方向上移动拉链。作为一个例子,看看zip-visit 库,它提供了对 zippers 的任意访问,并能够根据需要更改节点。

从文档中获取的示例:

(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

于 2015-08-24T20:02:59.123 回答
0

凯龙星

查看data.zip,因为它提供了链接谓词以获取所有感兴趣的记录以及更新节点的能力。

于 2015-08-25T10:33:16.483 回答