Functional programming 在拉链库中创建节点

Functional programming 在拉链库中创建节点,functional-programming,clojure,zipper,Functional Programming,Clojure,Zipper,我正在尝试从我自己的地图创建一个拉链。根据拉链的定义 Usage: (zipper branch? children make-node root) 参数分支?孩子们都很清楚,我能给他们下定义。但是make node函数令人困惑。我给了它一个实现,我认为它没有被使用 我有一张地图 {:question "Question 1" :yes "Answer1" :no {:question "Question 2"

我正在尝试从我自己的地图创建一个拉链。根据拉链的定义

Usage: (zipper branch? children make-node root)
参数分支?孩子们都很清楚,我能给他们下定义。但是make node函数令人困惑。我给了它一个实现,我认为它没有被使用

我有一张地图

{:question "Question 1" :yes "Answer1" 
                        :no {:question "Question 2"
                             :yes "Answer2"
                             :no "Answer3"}}
我想用这张地图做个拉链。所以我使用了下面的zippers函数调用

(zip/zipper map? 
    (fn [node] [(:yes node) (:no node)]) 
    (fn [node children] (:question node)) 
    question-bank)

这个很好用。即使给定make节点参数nil,它也可以工作。我不知道何时何地将使用此参数。

拉链允许您修改树以及在树上行走。如果尝试向树中添加新节点或修改现有节点,将调用
make node
函数。这有点奇怪,因为你的拉链根本没有暴露
:question
元素,但我可以将你的拉链写为:

(zip/zipper map? (juxt :yes :no) 
                 (fn [_ [yes no]] {:yes yes :no no}) 
                 root)
我个人很少使用拉链,所以这可能不是一个正确的实现;我只是想说明一下,
makenode
函数应该用来创建新的节点来连接到拉链上