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


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.