বিকল্প, মোনাডপ্লাস (বামক্যাচ) এবং মোনাডপ্লাস (বামদিকল্পসংস্থান) এর মধ্যে সম্পর্ক কী?


12

অনুসরণ করে একটি মোনাডের একটি উদাহরণ যা বিকল্প কিন্তু একটি মোনাডপ্লাস নয়? :

ধরুন একটি monad। সম্পর্ক betweem কি কি একটি হচ্ছে বিকল্প , একটি MonadPlusCatch এবং MonadPlusDistr ? মিmmসম্ভাব্য ছয়টি জোড়ার প্রত্যেকটির জন্য আমার কাছে এমন একটি প্রমাণ থাকতে হবে যা একজনের দ্বারা অন্যকে বোঝায়, বা একটি পাল্টা উদাহরণ যা এটি দেয় না।

(আমি ব্যাবহার করছি

  • MonadPlusCatch একটি পার্থক্য করতে MonadPlus মাফিক বাম-ক্যাচ নিয়ম:

    mplus (return a) b = return a
    
  • MonadPlusDistr একটি পার্থক্য করতে MonadPlus যে satifies বাম-বিতরণ নিয়ম:

    mplus a b >>= k = mplus (a >>= k) (b >>= k)
    

হাস্কেলওয়িকিতে মোনাডপ্লাস দেখুন )


আমার বর্তমান জ্ঞান + স্বজ্ঞাততা হ'ল:

  1. MonadPlusDist বিকল্প - সম্ভবত সত্য - এটা সহজবোধ্য মনে হয়, আমি বিশ্বাস করি আমি একটি প্রমাণ স্কেচ আছে, আমি এটা চেক করব এবং যদি এটি সঠিক, আমি পোস্ট করব এটা AndrewC এই অংশ উত্তর।→
  2. বিকল্প রাইটারো মোনাডপ্লাসডিস্ট - মিথ্যা - অ্যান্ড্রুসি তার উত্তরে যেমনটি দেখিয়েছিল : এটি বিকল্প , তবে এটি এটি মোনাডপ্লাসডিস্ট নয় (এটি মোনাডপ্লাসক্যাচ ) নয় বলে জানা গেছে ।→ Maybe
  3. মোনাডপ্লাসক্যাচ রাইটেরো বিকল্প - সম্ভবত মিথ্যা - আমি বিশ্বাস করি যে (বা মূলত কোনও কিছু ) একটি কাউন্টারিক্স নমুনা হিসাবে পরিবেশন করা উচিত। কারণটি হ'ল→ MaybeT (Either e)MaybeT m'

    ((pure x) <|> g) <*> a =    -- LeftCatch
        (pure x) <*> a
    -- which in general cannot be equal to
    ((pure x) <*> a) <|> (g <*> a)
    

    আবার আমি পরীক্ষা করে পোস্ট করব (মজার ব্যাপার হচ্ছে, ঠিক Maybeএটা প্রতিপাদ্য আছে, যদি কারণ আমরা বিশ্লেষণ করতে পারে aহয় Just somethingবা Nothing-। উপরোক্ত AndrewC এর উত্তর দেখুন)

  4. বিকল্প রাইটারো মোনাডপ্লাসক্যাচ - সম্ভবত মিথ্যা - যদি আমরা প্রমাণ করি যে মোনাদপ্লাসডিস্ট র্যাটারো বিকল্প তখন একটি পাল্টা উদাহরণ হিসাবে সার্ভার করবে। (অথবা আমরা স্পষ্টভাবে এর জন্য বিকল্প আইন প্রমাণ করতে পারি ।)→→ → [][]
  5. MonadPlusDist MonadPlusCatch - false - একটি পরিচিত পাল্টা উদাহরণ।→ []
  6. MonadPlusCatch MonadPlusDist - মিথ্যা - একটি পরিচিত পাল্টা উদাহরণ।→ Maybe

উত্তর:


8

MonadPlusDist বিকল্প সত্য।→

প্রত্নতাত্ত্বিক : বিকল্প রাইটারো মোনাডপ্লাসক্যাচটি মিথ্যা→

(কারণ হিসাবে পেত্র Pudlák নির্দিষ্ট, []একটি counterexample - এটা সন্তুষ্ট নয় MonadPlusCatch কিন্তু সন্তুষ্ট না 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)

<$>সম্প্রসারণ লেমমা
ধরে নিই আমরা একটি মোনাড থেকে কোনও ফান্টারের স্ট্যান্ডার্ড ডেরাইভেশনটি ব্যবহার করি, যথা (<$>) = 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) মোনাডপ্লাস আইনগুলি সন্তুষ্ট করুন। তুচ্ছভাবে তারপর এটি একটি অকার্যকর।

ডান জেলা <*>

আমি প্রমাণ করব

(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 >>=

প্রয়োজনীয়


1
গ্রেট। আমি এমনকি সন্দেহ left- আইন কোন ডান আইন প্রযোজ্য আবেদন , কিন্তু আমি কোন দলীল এতদূর আছে। স্বজ্ঞাততাটি হ'ল f <$>কোনও অভিব্যক্তিপূর্ণ ক্রিয়া করে না, এটি খাঁটি, তাই কোনওভাবে "পক্ষগুলি স্যুইচ" করা সম্ভব।
— পেটর পুদলক

@ পেটরপুদলক আপডেট হয়েছে - সমাপ্ত প্রমাণ এবং এ সম্পর্কে আপনার সমালোচনা যুক্ত করেছে []।
— অ্যান্ড্রুসি

@ পেটরপুদলক আপনি কী ভাবেন যে মোনাডপ্লাসক্যাচকে[] সন্তুষ্ট করে এমন কোনও প্রমাণ যুক্ত করা উচিত ? এই মুহূর্তে এটি হাস্কেল উইকির উপর কেবল একটি দাবি ser >>= kস্পষ্টভাবে ব্যবহার করে সংজ্ঞায়িত করা হয়েছেfoldr ((++).k)
— অ্যান্ড্রুসি

আমি মনে করি আপনি মোনাডপ্লাসডিস্ট মানে , তাই না? আমি মনে করি আমরা পারতাম, এটি বাস্তবতার প্রমাণটি সম্পূর্ণ করবে।
— পেটর পুদলক

@ পেটরপুদলক ওহ হ্যাঁ আমি দুঃখিত করব.
— অ্যান্ড্রুসি

6

→

আসলে এটি MaybeT Either:

{-# LANGUAGE FlexibleInstances #-}
import Control.Applicative
import Control.Monad
import Control.Monad.Trans.Maybe

instance (Show a, Show b) => Show (MaybeT (Either b) a) where
    showsPrec _ (MaybeT x) = shows x

main = print $
    let
        x = id :: Int -> Int
        g = MaybeT (Left "something")
        a = MaybeT (Right Nothing)
    -- print the left/right side of the left distribution law of Applicative:
    in ( ((return x) `mplus` g) `ap` a
       , ((return x) `ap` a) `mplus` (g `ap` a)
       )

আউটপুট হয়

(Right Nothing, Left "something")

যার মানে MaybeT Eitherবাম বন্টন আইন ব্যর্থ Applicative।


কারণটি হ'ল

(return x `mplus` g) `ap` a

উপেক্ষা g( বামক্যাচের কারণে ) এবং কেবলমাত্র মূল্যায়ন করে

return x `ap` a

তবে এটি অন্য পক্ষ যা মূল্যায়ন করে তার থেকে পৃথক:

g `ap` a
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.