編集:私は通常、新しいコードを理解するためにghciで実験しているので、私のような人のために、以下の例が付属するSchool of Haskellの投稿/ページを作成しましたが、編集可能で実行可能です。
この例で質問に答えられると思いますが、便宜上、別のノードを変更します。レンズのジッパー機能についての私の知識
はかなり浅いです。他の多くのパッケージと比較して、レンズパッケージのタイプを読んで慣れるのに少し時間がかかり
ますが、その後は悪くありません。この投稿の前は、レンズパッケージのジッパーモジュールやツリーモジュールを使用していませんでした。
木はかなりうまくいっていないshow
ので、時間があれば戻ってきて、かなり印刷されたものを追加します。そうでない場合は、これらの例を使用して、何が起こっているかを確認することが重要です。
表示
最初のノードの値を表示したい場合、ツリーレンズパッケージによると、これはルートと呼ばれ、次のことができます。
zipperTree & downward root & view focus
変更
その値を変更してツリーを再作成するには(ツリーを再圧縮します):
zipperTree & downward root & focus .~ 10 & rezip
ブランチを下に移動したい場合は、を使用する必要がありますdownward branches
。最初のブランチのルートを変更し、ツリーを再圧縮する例を次に示します。
zipperTree & downward branches
& fromWithin traverse
& downward root
& focus .~ 5
& rezip
ここで、ブランチのリストに移動します。次に、use fromWithin
useを使用traverse
してリストをトラバースします。これがタプルの場合は、both
代わりに使用できます。
トラバーサルパスの保存と再生
saveTape
restoreTape
後で復元できるように、ジッパー内の位置を保存できるようにします。
位置を保存します:
tape = zipperTree & downward branches
& fromWithin traverse
& downward root
& saveTape
次に、ツリーを通過するトラバーサルを再現するには、次のようにします。
t <- (restoreTape tape testTree)
次に、tを新しいジッパーとして使用し、通常どおりに変更できます。
t & focus .~ 15 & rezip
テープは、実行した手順を再生するため、他のツリーで作業できるため、上記で定義したように、次の手順がテープで機能します。
testTree2 = Node 1 [ Node 2 [] ]
t2 <- (restoreTape tape testTree2)
t2 & focus .~ 25 & rezip
複数の場所の変更
複数のルートを変更する場合は、ジッパーの再圧縮を控えてください。以下は、testTree2の2つのルートを変更します。
zipper testTree2 & downward root
& focus .~ 11
& upward
& downward branches
& fromWithin traverse
& downward root
& focus .~ 111
& rezip