「データ構造の一部を操作する」という意味でのアクセスを面白い形で抽象化するのがlensである。 このライブラリは以下の種類のアクセスを扱えるようになっている。
- 相互変換 (
Iso
) - 片側変換 (もう片方は常に可能) (
Prism
) - 読み出し・書き込み (
Lens
) - 複数の値の読み出し・書き込み (
Traversal
) - 読み出し (
Getter
) - 複数の値の読み出し (
Fold
) - (複数の値の)書き込み (
Setter
)
またlens-actionには一応モナド上での操作を行う方法も提供されている。
そしてこれらには「添字付き」バージョンが定義されていることが多い。
- 添字付きで複数の値の読み出し・書き込み (
IndexedLens
) - 添字付きで読み出し (
IndexedGetter
) - 添字付きで複数の値の読み出し (
IndexedFold
) - 添字付きで(複数の値の)書き込み (
IndexedSetter
) - 添字付きでモナド上での読み出し (
IndexedAction
) - 添字付きでモナド上での複数の値の読み出し (
IndexedMonadicFold
)
構造に恣意性があるとは思うが、とても綺麗に出来ているシステムだと感じる。これで完成なのだろうか。
気持ち的に
MonadicSetter
がほしくはなるが、これはlensの仕組み的に不可能である。+=
と+~
を統合することは良いことだろうか・・・
もっと「概念的に」値をセットする、というのはもうちょっと違う仕組みな気がする。
a -> IO ()
も値をセットしているかもしれない。こういうのはどうなんだろう。ただこれはもはや「アクセス」の余地はないのかもしれない。
でも今までのsetterと呼ばれた概念はこれを内包していたはずである。
既存の言語のgetter/setterを直接エンコードすると m a
と a -> m ()
になるはずである。そしてこれは必然的に起きるものでもある(FFI)。
全ての操作を形式化するにはこれらも扱えるようにするべきだろう。どうすればいいんだろうか。
特にこの場合のsetterは「部分構造の代入」ができない。もはやどうしようもないものである。