すごいH本ZipperHaskellで木構造の要素を変更したい場合、ルート要素から指定の要素が見つかるまで探索が必要になる。前回更新した要素の近くの要素を更新したい場合などでもルートから探す必要がある。そこでZipperを使ってデータ構造の要素の更新を簡単にする。r)どう考えてもわかりにくい。関数が方向のリストをとれるようにしてみる。方向とはLかRのいずれかで、左と右に対応し、方向指示に従ってたどり着いた位置の値を更新する。r方向リストに基づいて探索する要素を選択している。newTree'P'変わってる。方向リストは木の特定の部分木、注目点を指定する役割を果たしている。この方法は何度も要素を更新したい場合に効率が悪い。背後に残った道しるべ要素を探す時にパンくずを残していって、往路の履歴を覚えておくようにする。すると逆方向の移動ができるようになる。探索した方向の木と方向を追記したパンくずリストを返す関数。今のパンくずリストでは来た道を戻るための情報が足りていない。辿った木構造の情報もパンくずリストに持っておく必要がある。1つのパンくずには親ノードを構築するのに必要なすべてのデータを蓄えておく必要がある。辿る可能性のあった経路の情報も必要。パンくずリストを改良する。代わる新しいデータ型を作る。(Show)移動元に含まれていた要素と、辿らなかった部分木を持つようになっている。bs)上に上がる処理も追加している。あるデータ構造の注目点、および周辺の情報を含んでいるデータ構造のことをZipperという。型シノニムを定義する。bs)これは、空の部分木に対して新しい部分木を追加するだけでなく既存の部分木を置換もできる。Empty)))])goUpでルートまで戻ると新しい木が取得できる。[3,2,1])([3,4],[2,1])シンプルなファイルシステムごく単純化したファイルシステムを木で表現する。そのファイルシステムに対するZipperを作り、本物のファイルシステムみたいにフォルダ間を移動できるようにする。述語とリストを引数にとり、リストのペアを返す。述語がFalseを返すような要素が第一要素に入る。ここで、探していたものより前にあるか後ろにあるかを振り分けている。そのため、旧バージョンのデータに何の問題もなくアクセスできる。Zipperを使ってそのImmutableなデータ構造の中を効率よく移動できるようになった。足元にご注意パターンマッチに失敗するなどして実行時エラーが出るのをそのままにしていた。Maybeモナドを使って失敗の可能性という文脈を追加する。二分木を処理するZipperをモナディック関数に変更する。Justが返ってきている。goRightNothingちゃんと失敗してる。所感Zipperが木構造などを扱うのに役立つというのはわかった。自分ではまだ書けない。コインを投げる話の続き。(1)月別アーカイブスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。