→
→
(Petr Pudlák이 지적했듯이 []
반례입니다 -MonadPlusCatch를 만족 시키지 않지만 MonadPlusDist를 만족시키지 않으므로 Applicative )
가정 : MonadPlusDist 법칙
-- (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
하고 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)
<$>
expansion lemma
모나드에서 펑터의 표준 파생을 사용한다고 가정하자 (<$>) = 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 <$>
관용적 행동을 수행하지 않으며, 순수하기 때문에 어떻게 든 "측면 전환"이 가능할 수 있습니다.