→
→
(ペトルスキー-パドラックが指摘したようので、[]
反例である-それは満たさないMonadPlusCatchなく満たしていMonadPlusDist、したがってApplicativeのを)
想定:MonadPlusDist Laws
-- (mplus,mzero) is a monoid
mzero >>= k = mzero` -- left identity >>=
(a `mplus` b) >>= k = (a >>=k) `mplus` (b>>=k) -- left dist mplus
証明するために:代替法
-- ((<|>),empty) is a monoid
(f <|> g) <*> a = (f <*> a) <|> (g <*> a) -- right dist <*>
empty <*> a = empty -- left identity <*>
f <$> (a <|> b) = (f <$> a) <|> (f <$> b) -- left dist <$>
f <$> empty = empty -- empty fmap
<*>
拡張補題
モナドからの標準的な派生、つまり(<*>) = ap
and を使用すると仮定しますpure = return
。それから
mf <*> mx = mf >>= \f -> mx >>= \x -> return (f x)
なぜなら
mf <*> mx = ap mf mx -- premise
= liftM2 id mf mx -- def(ap)
= do { f <- mf; x <- mx; return (id f x) } -- def(liftM2)
= mf >>= \f -> mx >>= \x -> return (id f x) -- desugaring
= mf >>= \f -> mx >>= \x -> return (f x) -- def(id)
<$>
拡張補題
モナドからのファンクターの標準的な派生、つまりを使用すると仮定します(<$>) = liftM
。それから
f <$> mx = mx >>= return . f
なぜなら
f <$> mx = liftM f mx -- premise
= do { x <- mx; return (f x) } -- def(liftM)
= mx >>= \x -> return (f x) -- desugaring
= mx >>= \x -> (return.f) x -- def((.))
= mx >>= return.f -- eta-reduction
証明
(<+>
、m0
)はMonadPlusの法則を満たしていると仮定します。些細なことに、それはモノイドです。
右の距離 <*>
証明します
(mf <+> mg) <*> ma = (mf <*> ma) <+> (mg <*> ma) -- right dist <*>
表記法の方が簡単だからです。
(mf <+> mg) <*> ma = (mf <+> mg) >>= \forg -> mx >>= \x -> return (forg x) -- <*> expansion
= (mf >>= \f_g -> mx >>= \x -> return (f_g x))
<+> (mg >>= \f_g -> mx >>= \x -> return (f_g x)) -- left dist mplus
= (mf <*> mx) <+> (mg <*> mx) -- <*> expansion
左のアイデンティティ <*>
mzero <*> mx = mzero >>= \f -> mx >>= \x -> return (f x) -- <*> expansion
= mzero -- left identity >>=
要求に応じ。
左方 <$>
f <$> (a <|> b) = (f <$> a) <|> (f <$> b) -- left dist <$>
f <$> (a <+> b) = (a <+> b) >>= return . f -- <$> expansion
= (a >>= return.f) <+> (b >>= return.f) -- left dist mplus
= (f <$> a) <+> (f <$> b) -- <$> expansion
empty fmap
f <$> mzero = mzero >>= return.f -- <$> expansion
= mzero -- left identity >>=
要求に応じ
f <$>
慣用的なアクションを何も運んでいないということです。それは純粋なので、どうにか「側面を切り替える」ことが可能かもしれません。