是否有可能用Zippers编写一个通用算法来更新嵌套(无论如何嵌套)数据结构中的元素?



上周,我试图用Zippers编写一个算法来更新嵌套数据结构中的特定元素,如何在结构中移动元素,可能使用Zippers ?

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

这让我想到,是否有可能用Zippers编写通用算法来更新嵌套数据结构中的特定数据(无论它是如何嵌套的)?还是只有当你知道自己的步数时才会穿拉链?

我需要理解,正确地,我试图使拉链做一些不是什么拉链创建的。

绝对可以这样使用拉链,因为您可以在选择的任何方向移动拉链。作为一个例子,我们来看看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问题。

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

最新更新