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-book-notes