Applicativeは全ての引数が独立に計算される
from Applicative型クラス
pros
引数を独立に、並列に計算できる
cons
引数同士で依存が出来ない
e.g. 前の引数の結果を、後続の引数は参照できない
Applicativeは条件分岐ができない
Monadを使おう
Applicativeは各引数のコンテキストが独立して評価される
Applicative版のifのような関数を定義する ref
code:hs
cond :: Applicative f => f Bool -> f a -> f a -> f a
cond fb ft fe = pure cond' <*> fb <*> ft <*> fe
where
cond' b t e = if b then t else e
関数condは、ちょうどそのサブ関数のcond'のApplicative版
Identityに対して使用した場合
code:hs
runIdentity $ cond (pure True) (pure 1) (pure 2) -- 結果: 1
Identityは単に値をラップするだけのコンテキスト
この場合、pureや<*>は通常の関数適用と同じ
従って、結果はIdentity 1となる
Maybeに対して使用した場合
code:hs
cond (Just True) (Just 1) Nothing -- 結果: Nothing
第1引数がTrueなのに、第3引数が返ってきてるように見える
各引数が独立に評価された後に、condに適用される
例がやや恣意的では?mrsekut.icon
「Applicativeは条件分岐ができない」の例として適切でない気がする
単純に、引数にNothingがあれば、結果もNothingになるというだけ
いや、でもそういうものなのか?わからなくなってきたmrsekut.icon
QAで学ぶMonad - あどけない話
このように、Applicative は逐次的にコンテナを連結できます。ただし、それぞれのコンテナは独立した計算を実行します。
Applicative にできないことは、前のコンテナの計算結果を用いて、後のコンテナが振る舞いを変えることです。