Functor / Applicative / Monad 階層
Herding Cats で扱う、関数型プログラミングの中核となる型クラスの抽象化階層。「同じ問題を解けるならより仮定が少ない方が elegant」という原則のもと、F[_](エフェクト)を段階的に強くしていく。
Functor
- 「全体を写せる」型クラス。
map[A,B](fa: F[A])(f: A => B): F[B]。 - 関数の合成
(*3) . (+100)とfmapが一致する。liftでa -> bをF[a] -> F[b]に持ち上げる。 - Functor 則:
map(id) == id、map(f).map(g) == map(f andThen g)。
Applicative
- Functor より強い。Semigroupal/
product(F[A],F[B]→F[(A,B)])→ Apply/ap(F[A=>B]をF[A]に適用)→ Applicative/pure(普通の値をエフェクトに格上げ)。 pure (+) <*> Just 1 <*> Just 2のように複数引数関数を文脈内で適用。pure (+) <*>は(+) <$>と同じ。- 則: identity、homomorphism、interchange。パーザ開発(Parsec)から派生した抽象。
Monoid / Foldable と Monad
- Semigroup/Monoid があれば
Foldableで畳み込める。foldMapは写像後に畳み込む。 - FlatMap/Monad は
>>=(bind)で計算を連鎖させる。Just 2 >>= \x -> return (x+10)。
Scala の cats では型クラスを implicit で供給し、Haskell の Control.Applicative に対応する。圏論的背景は category-theory、隣接概念は typeclass-monoid-intro / effect-ts。関連: _moc-life-misc
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 等の再帰の抽象)も不変データ操作の道具立て。
- 効果やモナドの文脈はfunctor-applicative-monad・effect-ts。
関連
継続と代数的効果
計算の「効果」を制御・抽象化するための一連の概念。λ計算の継続を出発点に、代数的効果やモナドへ広がる。
継続と限定継続
- 継続 (continuation): ある時点での「残りの計算」を第一級の値として表したもの。引数渡しの方式(値呼び・参照呼び・名前呼び・必要呼び)や thunk(遅延値)と関連。
- 限定継続 (delimited continuation): 継続の範囲をデリミタで区切ったもの。
shift/resetなどで効果ハンドラを表現できる。
代数的効果 (Algebraic Effect)
「実行すると値が得られる」計算を型で表し、効果をハンドラで解釈する仕組み。Koka は代数的効果を言語機能として持つ。Scala の ZIO(ZIO[-R, +E, +A] ≈ R => Either[E, A])や Kyo(A < S 形式で IO・Abort・Env を合成)が実用例で、Effect.gen(function*(){ yield* ... }) 風の do 記法で書ける。
モナドによる定式化
- Monad(State モナド等)、Free Monad、Kleisli 圏、Tagless Final(DSL を型クラスで抽象)も効果合成の道具。Scala の cats が代表ライブラリ。
- TypeScript の Effect TS など言語横断の系譜はeffect-tsに詳しい。
関連
- 型の土台はtype-theory-lambda-cube、関連 FP 抽象はfunctor-applicative-monad。
- 言語横断比較はeffect-ts。
- _moc-lang-compilers