যদি আমরা প্রকারগুলি তুলনা করি
(<*>) :: Applicative a => a (s -> t) -> a s -> a t
(>>=) :: Monad m => m s -> (s -> m t) -> m t
দুটি ধারণাটি কী আলাদা করে তার জন্য আমরা একটি সূত্র পাই। যে (s -> m t)
এ ধরণের (>>=)
শো যে একটি মান s
একটি গণনার আচরণকে নির্ধারণ করতে পারেন m t
। মনডস মান এবং গণনার স্তরগুলির মধ্যে হস্তক্ষেপের অনুমতি দেয়। (<*>)
অপারেটর ধরনের কোনো হস্তক্ষেপ অনুমতি দেয়: ফাংশন এবং যুক্তি কম্পিউটেশন মান উপর নির্ভর করে না। এই সত্যিই কামড়। তুলনা করা
miffy :: Monad m => m Bool -> m x -> m x -> m x
miffy mb mt mf = do
b <- mb
if b then mt else mf
যা দুটি গুণনার মধ্যে সিদ্ধান্ত নিতে কিছু প্রভাবের ফলাফলকে ব্যবহার করে (উদাহরণস্বরূপ ক্ষেপণাস্ত্র উৎক্ষেপণ এবং একটি অস্ত্রশস্ত্র স্বাক্ষর)
iffy :: Applicative a => a Bool -> a x -> a x -> a x
iffy ab at af = pure cond <*> ab <*> at <*> af where
cond b t f = if b then t else f
যা দুটি গণনার মানগুলিরab
মধ্যে চয়ন করতে এবং উভয়ই সম্পাদন করে, সম্ভবত করুণ প্রভাবের জন্য ব্যবহার করে usesat
af
মোনাডিক সংস্করণ মূলত (>>=)
কোনও মান থেকে গণনা চয়ন করার অতিরিক্ত শক্তির উপর নির্ভর করে এবং এটি গুরুত্বপূর্ণ হতে পারে। যাইহোক, সেই শক্তিটিকে সমর্থন করা মনডকে রচনা করা শক্ত করে। আমরা যদি 'ডাবল-বাইন্ড' তৈরির চেষ্টা করি
(>>>>==) :: (Monad m, Monad n) => m (n s) -> (s -> m (n t)) -> m (n t)
mns >>>>== f = mns >>-{-m-} \ ns -> let nmnt = ns >>= (return . f) in ???
আমরা এটি এখন পর্যন্ত পেয়েছি, কিন্তু এখন আমাদের স্তরগুলি সমস্ত স্তম্ভিত হয়েছে। আমাদের একটি আছে n (m (n t))
, তাই আমাদের বাইরের দিক থেকে মুক্তি দেওয়া দরকার n
। যেমন আলেকজান্দ্রি সি বলেছেন, আমাদের যদি উপযুক্ত থাকে তবে আমরা তা করতে পারি
swap :: n (m t) -> m (n t)
n
ভিতরের দিকে এবং join
এটি অন্যটিতে ক্রমানুসারে n
।
দুর্বল 'ডাবল-প্রয়োগ' সংজ্ঞা দেওয়া অনেক সহজ
(<<**>>) :: (Applicative a, Applicative b) => a (b (s -> t)) -> a (b s) -> a (b t)
abf <<**>> abs = pure (<*>) <*> abf <*> abs
কারণ স্তরগুলির মধ্যে কোনও হস্তক্ষেপ নেই।
স্বতঃস্ফূর্তভাবে, যখন আপনার সত্যিকারের অতিরিক্ত পাওয়ার প্রয়োজন হয় Monad
এবং আপনি যখন কঠোর গণনার কাঠামো Applicative
সমর্থন করেন সেগুলি থেকে দূরে সরে যেতে পারেন তা স্বীকার করা ভাল ।
দ্রষ্টব্য, যাইহোক, যদিও মণাদ রচনা করা কঠিন, এটি আপনার প্রয়োজনের চেয়ে বেশি হতে পারে। প্রকারটি -আফেক্টগুলির m (n v)
সাথে কম্পিউটিং নির্দেশ করে m
, তারপরে n
-আফেক্টগুলির সাথে একটি- v
এ্যালুয়েলে গণনা করে, যেখানে- m
প্রভাবগুলি -আফেক্টগুলি শুরু হওয়ার আগে শেষ হয় n
(অতএব প্রয়োজনীয়তা swap
)। যদি আপনি কেবল- m
প্রভাবগুলির সাথে ইন্টারলিভ করতে চান n
, তবে রচনাটি সম্ভবত জিজ্ঞাসা করার জন্য খুব বেশি!