Zipper関連のパッケージ

先日コーディングしていてZipperが必要になる場面に出くわした。それは単純なList zipperだったので自前で実装して済ませたが、ふと、汎用的なZipperライブラリがあるかどうかが気になったので、少し調べた。

syz
traverse-with-class
uniplate
comonad-extras
zippo
zippers
  • zippers: Traversal based zippers
  • lensパッケージに依存。
  • LensやIndexedLensを使ってZipperのフォーカスを動かす。
  • (:>)といった型コンビネータ(?)を使い、非均一なデータ構造を辿る場合でも経路の型情報を全て保持する。


使い勝手がよさそうなのはsyzであるが、generic programmingを使う以上、型安全性が少しだけ弱いように思える。実際に使う場合はMaybeがたくさん出てきそう。

zippersはかなり型安全に見えるが、lensへの依存はそれなりに重い。また、Zipperの型を自分で正しく記述するのは至難の業なようにも思える。全て型推論に任せられるならいいが。