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
বলে মনে হচ্ছে ।