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এটি (এবং কখনও কখনও) সম্পূর্ণ আলাদা কিছু হতে পারে।
Applicativeএবং হুবহু একই (মডুলো সুপারক্লাস সীমাবদ্ধতা)MonadPlusবলে মনে হচ্ছে ।