→
→
(เพราะอย่างที่ Petr Pudlákชี้ให้เห็น[]
เป็นตัวอย่าง - มันไม่ตอบสนองMonadPlusCatchแต่ไม่พอใจMonadPlusDistดังนั้นจึงใช้งานได้ )
สันนิษฐานว่า: MonadPlus กฎหมายหมอก
-- (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
<*>
การขยายตัวแทรก
สมมติเราใช้รากศัพท์มาตรฐานของ applicative จาก monad ที่คือและ(<*>) = 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)
<$>
การขยายตัวแทรก
สมมติเราใช้รากศัพท์มาตรฐาน functor จาก monad (<$>) = 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 อย่างน้อยก็เป็น monoid
Dist ขวา <*>
ฉันจะพิสูจน์
(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 >>=
ตามความจำเป็น.
Dist ซ้าย <$>
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 <$>
ไม่กระทำการใด ๆ ที่เป็นสำนวนมันบริสุทธิ์ดังนั้นจึงอาจเป็นไปได้ที่จะ "สลับข้าง"