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 で合成でき、fstLsndL をネストして ((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-effectseffect-ts

関連