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 に答える