মোনাডপ্লাস, বিকল্প এবং মনোয়েড টাইপক্লাসগুলির মধ্যে পার্থক্য?


85

মান-গ্রন্থাগার Haskell, typeclasses MonadPlus, Alternativeএবং Monoidপ্রতিটি মূলত একই শব্দার্থবিদ্যা সঙ্গে দুটি পদ্ধতি প্রদান:

  • একটি খালি মান: mzero, empty, অথবা mempty
  • একটি অপারেটর a -> a -> aএকসঙ্গে typeclass মান যোগদান করে: mplus, <|>, অথবা mappend

তিনটিই এই আইনগুলিকে নির্দিষ্ট করে যেখানে উদাহরণগুলি মেনে চলতে হবে:

mempty `mappend` x = x
x `mappend` mempty = x

সুতরাং, মনে হচ্ছে তিনটি টাইপক্লাসগুলি একই পদ্ধতি সরবরাহ করছে ।

( Alternativeএছাড়াও সরবরাহ করে someএবং manyতবে তাদের ডিফল্ট সংজ্ঞা সাধারণত পর্যাপ্ত থাকে এবং তাই তারা এই প্রশ্নের ক্ষেত্রে খুব বেশি গুরুত্বপূর্ণ নয় not)

সুতরাং, আমার জিজ্ঞাসাটি হ'ল: কেন এই তিনটি অত্যন্ত একই ধরণের শ্রেণি রয়েছে? তাদের পৃথককারী সুপারক্লাসের প্রতিবন্ধকতা ছাড়াও কি তাদের মধ্যে সত্যিকারের পার্থক্য রয়েছে?


এটা একটা ভালো প্রশ্ন. বিশেষত, Applicativeএবং হুবহু একই (মডুলো সুপারক্লাস সীমাবদ্ধতা) MonadPlusবলে মনে হচ্ছে ।
পিটার

4
এছাড়াও আছে ArrowZeroএবং ArrowPlusতীর জন্য। আমার বাজি: টাইপ সিগনেচার ক্লিনার করতে (যা আলাদা সুপারক্লাসকে সত্যিকারের পার্থক্যের সীমাবদ্ধ করে তোলে )।
ক্যাট প্লাস প্লাস

4
@ গুগলপ্লাস প্লাস: ভাল, ArrowZeroএবং ArrowPlusসদয় * -> * -> *, যার অর্থ আপনি একটি ফাংশনের জন্য একবার এটি তীরের ধরণের জন্য প্রেরণ করতে পারেন যা তাদেরকে বিভিন্ন ধরণের জন্য ব্যবহার Monoidকরা প্রয়োজন , এটি ব্যবহার করতে আপনাকে Monoidপ্রতিটি বিশেষের জন্য উদাহরণ প্রয়োজন ইনস্ট্যান্টেশন, এবং আপনার কোনও গ্যারান্টি নেই যে সেগুলি একইভাবে পরিচালিত হয়েছিল, উদাহরণগুলি সম্পর্কযুক্ত হতে পারে!
এডওয়ার্ড কেএমইটিটি

উত্তর:


122

MonadPlusএবং Monoidবিভিন্ন উদ্দেশ্যে পরিবেশন।

Monoidএক ধরণের পরামিতিযুক্ত *

class Monoid m where
    mempty :: m
    mappend :: m -> m -> m

এবং সুতরাং এটি প্রায় কোনও প্রকারের জন্য ইনস্ট্যান্টেশন করা যেতে পারে যার পক্ষে একটি সুস্পষ্ট অপারেটর রয়েছে যা সংঘবদ্ধ এবং যার একটি ইউনিট রয়েছে।

যাইহোক, MonadPlusকেবলমাত্র আপনার নিরবিচ্ছিন্ন কাঠামো রয়েছে তা নির্দিষ্ট করে না, তবে সেই কাঠামোটি কীভাবে Monadকাজ করে তার সাথে সম্পর্কিত এবং সেই কাঠামোটি মোনাডে থাকা মূল্য সম্পর্কে চিন্তা করে না, এটি (অংশে) সত্য দ্বারা নির্দেশিত যে MonadPlusধরনের একটি যুক্তি লাগে * -> *

class Monad m => MonadPlus m where
    mzero :: m a
    mplus :: m a -> m a -> m a

একঘেয়েমি আইন ছাড়াও, আমাদের কাছে প্রয়োগ করতে পারি এমন দুটি সম্ভাব্য আইন রয়েছে MonadPlus। দুঃখের বিষয়, সম্প্রদায়টি তাদের কী হওয়া উচিত তা নিয়ে দ্বিমত পোষণ করে।

কমপক্ষে আমরা জানি

mzero >>= k = mzero

তবে দুটি প্রতিযোগিতামূলক এক্সটেনশন রয়েছে, বাম (sic) বন্টন আইন

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

এবং বাম ধরা আইন

mplus (return a) b = return a

সুতরাং কোনও উদাহরণে MonadPlusএই অতিরিক্ত আইনগুলির একটি বা উভয়কেই সন্তুষ্ট করা উচিত।

তাহলে কি Alternative?

Applicativeপরে সংজ্ঞায়িত করা হয়েছিল Monad, এবং যৌক্তিকভাবে এর একটি সুপারক্লাস হিসাবে অন্তর্ভুক্ত Monad, তবে মূলত হাস্কেল 98 এ ডিজাইনারদের উপর বিভিন্ন চাপের কারণে এমনকি 2015 পর্যন্ত Functorএকটি সুপারক্লাসও ছিল না n't Monadএখন শেষ পর্যন্ত আমাদের জিএইচসি-তে Applicativeএকটি সুপারক্লাস হিসাবে রয়েছে Monad(যদি না হয়) এখনও একটি ভাষা স্ট্যান্ডার্ড।)

কার্যকরীভাবে, Alternativeহয় Applicativeকি MonadPlusহয় Monad

এই জন্য আমরা পেতে চাই

empty <*> m = empty

আমাদের সাথে যা আছে তা MonadPlusএকইভাবে এবং একই রকম বিতরণযোগ্য এবং ক্যাপ বৈশিষ্ট্য রয়েছে যার মধ্যে কমপক্ষে একটির আপনাকে সন্তুষ্ট করা উচিত।

দুর্ভাগ্যক্রমে, এমনকি empty <*> m = emptyআইনও খুব শক্ত দাবি a এটি পিছনের দিকে ধরে রাখে না , উদাহরণস্বরূপ!

আমরা যখন মোনাডপ্লাসের দিকে তাকাই, খালি >> = f = খালি আইনটি আমাদের প্রায় বাধ্য করে। খালি নির্মাণে fকোনওভাবেই এতে ফাংশনটি কল করতে কোনও 'এ' থাকতে পারে না ।

যাইহোক, Applicativeহয় না একটি সুপারক্লাস Monadএবং Alternativeহয় না একটি সুপারক্লাস MonadPlus, আমরা আলাদাভাবে উভয় স্থানেই সংজ্ঞা তলিয়ে।

তদুপরি, এমনকি যদি Applicativeএকটি সুপার ক্লাস ছিল Monad, আপনি MonadPlusযেভাবেই হোক ক্লাসের প্রয়োজন বয়ে যাবেন , কারণ আমরা যদি তা মানি তবে

empty <*> m = empty

এটি প্রমাণ করার পক্ষে যথেষ্ট নয় isn't

empty >>= f = empty

সুতরাং কিছু MonadPlusদাবি করা তার চেয়ে দাবিদার চেয়ে শক্তিশালী Alternative

এখন, কনভেনশন অনুসারে, MonadPlusএবং Alternativeপ্রদত্ত প্রকারের জন্য একমত হওয়া উচিত, তবে এটি সম্পূর্ণ আলাদা Monoidহতে পারে ।

উদাহরণস্বরূপ MonadPlusএবং এর Alternativeজন্য Maybeসুস্পষ্ট কাজটি করুন:

instance MonadPlus Maybe where
    mzero = Nothing
    mplus (Just a) _  = Just a
    mplus _        mb = mb

কিন্তু Monoidদৃষ্টান্তটি একটিতে একটি আধা গোষ্ঠী তুলেছে Monoid। দুঃখের বিষয় যেহেতু Semigroupহাস্কেল ৯৮-তে তখন কোনও শ্রেণি ছিল না, এটি একটিকে চিহ্নিত করে Monoid, তবে এর ইউনিটটি ব্যবহার না করে এটি করে। ಠ_ಠ

instance Monoid a => Monoid (Maybe a) where
    mempty = Nothing
    mappend (Just a) (Just b) = Just (mappend a b)
    mappend Nothing x = x
    mappend x Nothing = x
    mappend Nothing Nothing = Nothing

টিএল; ডিআর এর MonadPlus চেয়ে শক্তিশালী দাবি Alternative, যা পরিবর্তে আরও শক্ত দাবি Monoid, এবং যখন কোনও প্রকারের জন্য MonadPlusএবং Alternativeউদাহরণগুলি সম্পর্কিত হওয়া উচিত তবে Monoidএটি (এবং কখনও কখনও) সম্পূর্ণ আলাদা কিছু হতে পারে।


4
দুর্দান্ত উত্তর, যদিও শেষ সংজ্ঞাটি ভুল বলে মনে হচ্ছে, এটি সন্তুষ্ট নয় mempty `mappend` x ≡ x
ভিটাস

4
দুর্দান্ত উত্তর। কেউ কি এমন কোনও (সাধারণভাবে ব্যবহৃত) টাইপ সম্পর্কে জানেন যা এর আলাদা MonadPlus এবং Alternativeবাস্তবায়ন করে?
পিটার

7
@ অ্যাডওয়ার্ডকমেট: এই উত্তরটি থেকে বোঝা যাচ্ছে যে এমন একটি হতে পারে Monadযা একটি Alternativeতবে একটি নয় MonadPlus। আমি এর নির্দিষ্ট উদাহরণ খোঁজার বিষয়ে একটি প্রশ্ন জিজ্ঞাসা করেছি ; যদি আপনি একজনের সম্পর্কে জানেন তবে আমি এটি দেখতে পছন্দ করব।
আন্টাল স্পেক্টর-জাবুস্কি

4
আপনি monadplus জন্য বাম ক্যাচ আইন ব্যাখ্যা করতে পারেন? এটি স্পষ্টতই লঙ্ঘন করেছে []; []] এর দ্বিতীয় যুক্তিটি যদি প্রথমটি খালি হয় তবে সত্যই তা উপেক্ষা করা উচিত?
বেন ডাব্লু

4
@ নতুন বাম বিতরণ যুক্তিযুক্তভাবে আরও বোধগম্য আইন, তবে এটি কিছু উদাহরণ ধরে রাখে না। বাম ধরা একটি বিকল্প আইন যা এই অন্যান্য দৃষ্টান্তগুলি সমর্থন করে তবে এটি অন্যদের বেশিরভাগের দ্বারা সমর্থিত নয়। ফলস্বরূপ, আমাদের কাছে সত্যিই 2 টি বিভিন্ন দাবী সম্পর্কিত আইন রয়েছে যা বিভিন্ন দৃষ্টান্ত দ্বারা বাস্তবায়িত হয়, তাই MonadPlusসত্যই দুটি শ্রেণি এক হিসাবে ছদ্মবেশযুক্ত কারণ বেশিরভাগ লোকের যত্ন নেই।
এডওয়ার্ড কেএমইটিটি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.