একটা জিনিষ এটি বিভ্রান্তিকর তোলে মত "জনপ্রিয়" ফাংশন হয় bindএবং <*>অনুশীলনের ওরিয়েন্টেড করছে। তবে ধারণাগুলি বোঝার জন্য প্রথমে অন্যান্য ফাংশনগুলি তাকাতে আরও সহজ। এগুলিও লক্ষণীয় যে মনডগুলি আলাদা হয়ে দাঁড়িয়েছে কারণ তারা অন্যান্য সংযুক্ত ধারণাগুলির তুলনায় কিছুটা ওভারহাইপযুক্ত। সুতরাং আমি পরিবর্তে ফান্টেক্টর দিয়ে শুরু করব।
ফ্যাক্টররা একটি ফাংশন সরবরাহ করে (হাস্কেল নোটেশনে) fmap :: (Functor f) => (a -> b) -> f a -> f b। অন্য কথায় আপনার কাছে এমন একটি প্রসঙ্গ রয়েছে fযা আপনি কোনও ফাংশনটি এতে তুলতে পারেন। আপনি প্রায় কল্পনা করতে পারেন যে কোনও ফান্টেক্টর। তালিকাগুলি, হতে পারে, হয়, ফাংশন, I / O, টিপলস, পার্সার্স ... প্রত্যেকটি একটি প্রসঙ্গ প্রতিনিধিত্ব করে যেখানে কোনও মান উপস্থিত হতে পারে। সুতরাং আপনি চূড়ান্ত বহুমুখী ফাংশন লিখতে পারেন যা ব্যবহার করে fmapবা এর ইনলাইন রূপটি প্রায় কোনও প্রসঙ্গে কাজ করে <$>।
প্রসঙ্গের সাথে আপনি কি অন্যান্য জিনিসগুলি করতে চান? আপনি দুটি বিষয়গুলি একত্রিত করতে চাইতে পারেন। আপনার একটি সাধারণীকরণ পেতে চাইতে পারেন তাই zip :: [a] -> [b] -> [(a,b)]এই রকম উদাহরণস্বরূপ: pair :: (Monoidal f) => f a -> f b -> f (a,b)।
কিন্তু এটা আরও বেশি দরকারী বাস্তবে কারণ, Haskell, পরিবর্তে অফার পাঠাগাি Applicative, যার মধ্যে সংমিশ্রণ Functorএবং Monoidal, এবং এছাড়াও এর Unitযা শুধু বলেছেন যে আপনি আসলে লাগাতে পারেন মান "ভিতরে" সঙ্গে আপনার কনটেক্সট, unit।
আপনি যে প্রসঙ্গে কাজ করছেন সে সম্পর্কে এই তিনটি বিষয় উল্লেখ করে আপনি অত্যন্ত জেনেরিক ফাংশন লিখতে পারেন।
Monadআপনি যে শীর্ষে বলতে পারেন তা ঠিক অন্য একটি বিষয়। আমি এর আগে যা উল্লেখ করি নি তা হ'ল আপনার কাছে ইতিমধ্যে দুটি প্রসঙ্গকে একত্রিত করার দুটি উপায় রয়েছে: আপনি কেবল সেগুলিই পারবেন না pairতবে আপনি সেগুলিও সজ্জিত করতে পারেন, উদাহরণস্বরূপ আপনার তালিকাগুলির একটি তালিকা থাকতে পারে। I / O প্রসঙ্গে, একটি উদাহরণ হ'ল I / O ক্রিয়া যা কোনও ফাইল থেকে অন্যান্য I / O ক্রিয়াকলাপ পড়তে পারে, যাতে আপনার টাইপ থাকে FilePath -> IO (IO a)। এক্সিকিউটেবল ফাংশন পেতে আমরা কীভাবে সেই স্ট্যাকিং থেকে মুক্তি পেতে পারি IO a? যে যেখানে আছে Monadগুলি joinআসে এটা আমাদের একই ধরনের দুটি স্তুপীকৃত প্রেক্ষিতে একত্রিত করতে দেয়। একই জিনিসটি পার্সার, সম্ভবত ইত্যাদি ক্ষেত্রেও ব্যবহৃত হয় এবং bindএটি ব্যবহারের আরও একটি ব্যবহারিক উপায়join
সুতরাং কোনও একজাতীয় প্রসঙ্গে কেবল চারটি জিনিস সরবরাহ করতে হয় এবং এটি I / O, পার্সার্স, ব্যর্থতা ইত্যাদির জন্য তৈরি করা প্রায় সমস্ত যন্ত্রপাতি দিয়ে ব্যবহার করা যেতে পারে it