Optics と Lens
Optics は不変データ構造への合成可能なアクセサの総称。Lens はその一種で、getter と setter(更新)を一つにまとめた「直積へのフォーカス」。Prism(直和へのフォーカス)、Iso、Traversal などが仲間で、Lens は Iso の特殊化とみなせる。
基本 Lens
最も素朴な定義は getter と updater の組:
data Lens s a = Lens
{ get :: s -> a
, update :: (a -> a) -> s -> s }compose :: Lens b c -> Lens a b -> Lens a c で合成でき、fstL・sndL をネストして ((3,4),5) の深い位置を更新できる。
van Laarhoven 表現
実用ライブラリ(Haskell lens)では van Laarhoven lens が使われる。CPS(継続渡し)的に Functor で表現し、RankNTypes を必要とする。basic lens と van Laarhoven lens は圏同型の視点で結びつく。TypeScript では monocle-ts、関数型ユーティリティは fp-ts が提供する。
関連 FP 概念
- Traversable(畳み込み可能・走査可能な構造)、Recursion Schemes(catamorphism 等の再帰の抽象)も不変データ操作の道具立て。
- 効果やモナドの文脈はdelimited-continuations-effects・effect-ts。
関連
- 型表現はtype-theory-lambda-cube、実装言語はhaskell-ghc。
- _moc-prog-lang