আমি বলব যে সবচেয়ে ভাল জিজ্ঞাসা করার বিষয়টি হ'ল আমরা এটিকে কীভাবে ডাকব তা নয়, তবে আমরা কীভাবে কোডটির এই অংশটি বিশ্লেষণ করব । এবং এই জাতীয় বিশ্লেষণে আমার প্রথম মূল প্রশ্নটি হ'ল:
- পার্শ্ব প্রতিক্রিয়া কি কার্যকারিতা যুক্তির উপর নির্ভর করে, বা পার্শ্ব প্রতিক্রিয়াটির ফলাফল?
- না: "কার্যকর কার্যকারিতা" একটি বিশুদ্ধ ফাংশন, একটি কার্যকর ক্রিয়া এবং তাদের সংমিশ্রনের জন্য একটি ব্যবস্থায় পুনঃসংশ্লিষ্ট করা যেতে পারে।
- হ্যাঁ: "কার্যকরী ফাংশন" এমন একটি ফাংশন যা মোনাদিক ফলাফল তৈরি করে।
এটি হাস্কেল চিত্রিত করার জন্য সোজা (এবং এই বাক্যটি কেবল অর্ধেক রসিকতা)। "না" মামলার উদাহরণ এরকম কিছু হতে পারে:
double :: Num a => a -> IO a
double x = do
putStrLn "I'm doubling some number"
return (x*2)
এই উদাহরণে আমরা যে পদক্ষেপ নিই (লাইনটি প্রিন্ট করব "I'm doubling some number"
) তার x
ফলাফল এবং ফলাফলের মধ্যে কোনও প্রভাব ফেলবে না । এর অর্থ আমরা এটিকে এটিকে ( Applicative
ক্লাস এবং এটির *>
অপারেটর ব্যবহার করে ) রিফ্যাক্টর করতে পারি , যা দেখায় যে ফাংশন এবং প্রভাবটি আসলে অর্থেগোনাল:
double :: Num a => a -> IO a
double x = action *> pure (function x)
where
-- The pure function
function x = x*2
-- The side effect
action = putStrLn "I'm doubling some number"
সুতরাং এই ক্ষেত্রে আমি ব্যক্তিগতভাবে বলব যে এটি এমন একটি ক্ষেত্রে যেখানে আপনি একটি খাঁটি ফাংশন তৈরি করতে পারেন। হাস্কেল প্রোগ্রামিংয়ের প্রচুর পরিমাণে এটি effect কার্যকর কোড থেকে খাঁটি অংশগুলি কীভাবে নির্ধারণ করা যায় তা শিখতে।
"হ্যাঁ" সাজানোর উদাহরণ, যেখানে খাঁটি এবং কার্যকর অংশগুলি অর্থোগোনাল নয়:
double :: Num a => a -> IO a
double x = do
putStrLn ("I'm doubling the number " ++ show x)
return (x*2)
এখন, আপনি যে স্ট্রিংটি মুদ্রণ করছেন তার মানের উপর নির্ভর করে x
। ফাংশন অংশ (সংখ্যাবৃদ্ধি x
২) তবে, এ সব প্রভাব উপর নির্ভর করে না তাই আমরা এখনও এটি খুঁজে বিবেচনার করতে পারেন:
logged :: (a -> b) -> (a -> IO x) -> IO b
logged function logger a = do
logger a
return (function a)
double x = logged function logger
where function = (*2)
logger x putStrLn ("I'm doubling the number " ++ show x)
আমি অন্য উদাহরণগুলির বানানটি চালিয়ে যেতে পারলাম, তবে আমি আশা করি যে আমি যে পয়েন্টটি দিয়ে শুরু করেছি তা বোঝানোর জন্য এটি যথেষ্ট: আপনি এটিকে কিছু "কল" করেন না, বিশুদ্ধ এবং কার্যকর অংশগুলি কীভাবে সম্পর্কযুক্ত এবং ফ্যাক্টর যখন থাকে তখন তা বিশ্লেষণ করেন আপনার সুবিধার জন্য।
হাস্কেল তার Monad
শ্রেণিটি এত বিস্তৃতভাবে ব্যবহার করার একটি কারণ । মনডস (অন্যান্য জিনিসের মধ্যে) এই ধরণের বিশ্লেষণ এবং পুনরায় সংশোধন করার জন্য একটি সরঞ্জাম।