2

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

Usage: (zipper branch? children make-node root)

参数分支?孩子们很清楚,我能够定义它。但是 make-node 功能令人困惑。我给出了一个我认为没有被使用的实现。

我有一张地图

{:question "Question 1" :yes "Answer1" 
                        :no {:question "Question 2"
                             :yes "Answer2"
                             :no "Answer3"}}

我想从这张地图上做一个拉链。所以我使用了以下拉链函数调用,

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

这工作正常。即使给 make-node 参数 nil,它也可以工作。我不明白何时何地将使用此参数。

4

1 回答 1

2

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

(zip/zipper map? (juxt :yes :no) 
                 (fn [_ [yes no]] {:yes yes :no no}) 
                 root)

我个人不太使用拉链,所以这可能不是一个正确的实现;我只是希望说明该make-node函数应该用于创建新节点以附加到拉链。

于 2011-10-03T00:35:07.163 回答