Zipper関連のパッケージ
先日コーディングしていてZipperが必要になる場面に出くわした。それは単純なList zipperだったので自前で実装して済ませたが、ふと、汎用的なZipperライブラリがあるかどうかが気になったので、少し調べた。
syz
- syz: Scrap Your Zippers
- Dataクラスインスタンスのデータ型からZipperを作れる。
- データコンストラクタで作られるツリーをたどるようなものに見える。
traverse-with-class
- traverse-with-class: Generic applicative traversals
- 依存関係が小さい
- syzの改良版らしい。
- GTraversableという独自クラスのインスタンスについてZipperを作る(?)
uniplate
- uniplate: Help writing simple, concise and fast generic operations.
- Uniplateという独自のgeneric programmingモデルを使っている。
- 比較的依存関係が小さい
- APIを見たところ、一様なデータ構造にしか適用できないかも?
comonad-extras
- comonad-extras: Exotic comonad transformers
- ComonadStoreクラスベース。
- 機能や使い勝手はよく分からない。
zippo
- zippo: A simple lens-based, generic, heterogenous, type-checked zipper library
- deprecated (lensもしくはzippersを参照)
- yallというLens実装ベース。
zippers
- zippers: Traversal based zippers
- lensパッケージに依存。
- LensやIndexedLensを使ってZipperのフォーカスを動かす。
- (:>)といった型コンビネータ(?)を使い、非均一なデータ構造を辿る場合でも経路の型情報を全て保持する。
使い勝手がよさそうなのはsyzであるが、generic programmingを使う以上、型安全性が少しだけ弱いように思える。実際に使う場合はMaybeがたくさん出てきそう。
zippersはかなり型安全に見えるが、lensへの依存はそれなりに重い。また、Zipperの型を自分で正しく記述するのは至難の業なようにも思える。全て型推論に任せられるならいいが。