এটি প্রকৃতপক্ষে কেবলমাত্র একটি সাধারণ ডেটা কনস্ট্রাক্টর যা প্রিলিউডে সংজ্ঞায়িত করা হয় , এটি স্ট্যান্ডার্ড লাইব্রেরি যা প্রতিটি মডিউলে স্বয়ংক্রিয়ভাবে আমদানি করা হয়।
কি হতে পারে, কাঠামোগত
সংজ্ঞাটি এরকম কিছু দেখায়:
data Maybe a = Just a
| Nothing
ঘোষণা একটি টাইপ, সংজ্ঞায়িত Maybe a, যা একটি টাইপ পরিবর্তনশীল দ্বারা স্থিতিমাপ হয় a, যার মানে আপনি স্থানে কোনো ধরনের সঙ্গে এটি ব্যবহার করতে পারেন a।
নির্মাণ এবং ধ্বংস
ধরণের দুটি কনস্ট্রাক্টর রয়েছে Just aএবং Nothing। যখন কোনও ধরণের একাধিক কনস্ট্রাক্টর থাকে, এর অর্থ হ'ল এই ধরণের মান অবশ্যই সম্ভাব্য নির্মাতাদের মধ্যে একটির সাথে তৈরি করা উচিত। এই ধরণের জন্য, একটি মান হয় হয় মাধ্যমে নির্মিত হয়েছিল Justবা Nothing, অন্য কোনও (ত্রুটিবিহীন) সম্ভাবনা নেই।
যেহেতু Nothingকোনও প্যারামিটার প্রকার নেই, যখন এটি নির্মাণকারী হিসাবে ব্যবহৃত হয় তখন এটি একটি ধ্রুবক মানটির নাম দেয় যা Maybe aসমস্ত ধরণের টাইপের সদস্য a। তবে Justকনস্ট্রাক্টরের একটি টাইপ প্যারামিটার থাকে, যার অর্থ দাঁড়ায় যে কনস্ট্রাক্টর হিসাবে ব্যবহৃত হলে এটি টাইপ থেকে ফাংশনের মতো কাজ aকরে Maybe a, অর্থাৎ এতে টাইপ থাকেa -> Maybe a
সুতরাং, কোনও প্রকারের নির্মাতারা সেই ধরণের মান তৈরি করে; জিনিসের অন্য দিকটি হ'ল আপনি যখন সেই মানটি ব্যবহার করতে চান এবং সেই সাথে প্যাটার্ন ম্যাচটি খেলতে আসে। ফাংশনগুলির বিপরীতে, কনস্ট্রাক্টরগুলি প্যাটার্ন বাইন্ডিং এক্সপ্রেশনগুলিতে ব্যবহার করা যেতে পারে, এবং এই পদ্ধতিতে আপনি একাধিক কনস্ট্রাক্টর সহ ধরণের মানগুলির ক্ষেত্রে বিশ্লেষণ করতে পারেন ।
Maybe aকোনও প্যাটার্ন ম্যাচে কোনও মান ব্যবহার করতে, আপনাকে প্রতিটি কন্সট্রাক্টরের জন্য একটি প্যাটার্ন সরবরাহ করতে হবে:
case maybeVal of
Nothing -> "There is nothing!"
Just val -> "There is a value, and it is " ++ (show val)
সেক্ষেত্রে প্রকাশের ক্ষেত্রে, মানটি হলে প্রথম প্যাটার্নটি মিলবে এবং মানটি যদি নির্মিত হয় Nothingতবে দ্বিতীয়টি মিলবে Just। যদি দ্বিতীয়টি ম্যাচ করে তবে এটির সাথে সেই মানটির সাথে আবদ্ধ হয় যা নির্ধারকের কাছে দেওয়া valহয়েছিল Justযখন আপনি যে মানটির সাথে মিলে যা মানটি তৈরি হয়েছিল।
কি হতে পারে মানে
এটি কীভাবে কাজ করে তা সম্পর্কে আপনি ইতিমধ্যে পরিচিত ছিলেন; Maybeমানগুলির কাছে আসলে কোনও জাদু নেই , এটি কেবলমাত্র একটি সাধারণ হাস্কেল বীজগণিত ডেটা টাইপ (এডিটি)। তবে এটি বেশ খানিকটা ব্যবহৃত হয়েছে কারণ এটি কার্যকরভাবে "উত্তোলন" করে বা কোনও প্রকারকে প্রসারিত করে, যেমন Integerআপনার উদাহরণ থেকে, এমন একটি নতুন প্রসঙ্গে যা এর অতিরিক্ত মূল্য ( Nothing) যা মানের অভাবকে প্রতিনিধিত্ব করে! টাইপ সিস্টেম তারপর যে আপনি যে অতিরিক্ত মান জন্য চেক আগেই আপনি এ পেতে দেব প্রয়োজন Integerযে পারে সেখানে। এটি বাগের উল্লেখযোগ্য সংখ্যক প্রতিরোধ করে।
অনেক ভাষা আজ নুল রেফারেন্সের মাধ্যমে এই ধরণের "নো-মান" মানটি পরিচালনা করে। টনি হোয়ার, একটি বিশিষ্ট কম্পিউটার বিজ্ঞানী (তিনি কুইকসোর্ট আবিষ্কার করেছিলেন এবং তিনি টুরিং অ্যাওয়ার্ড বিজয়ী) তিনি তার "বিলিয়ন ডলারের ভুল" হিসাবে এটির মালিক । সম্ভবত প্রকারটি এটির সমাধানের একমাত্র উপায় নয়, তবে এটি এটি কার্যকর করার উপায় হিসাবে প্রমাণিত হয়েছে।
ফ্যান্টেক্টর হিসাবে হতে পারে
এক প্রকারকে অন্য ধরণের রূপান্তরিত করার ধারণাটি যেমন পুরানো প্রকারের ক্রিয়াকলাপগুলিকে নতুন ধরণের কাজ করতেও রূপান্তর করা যায় যা হ্যাস্কেল প্রকার শ্রেণীর পিছনে ধারণাকে বলা হয় Functor, যার Maybe aএকটি কার্যকর উদাহরণ রয়েছে।
Functorনামক একটি পদ্ধতি সরবরাহ করে fmap, যা বেস টাইপ থেকে মানগুলির মধ্যে সীমাবদ্ধ ফাংশনগুলি মানচিত্র করে (যেমনInteger ) থেকে উত্তোলন প্রকারের (যেমন Maybe Integer) থেকে মানগুলির মধ্যে সীমাবদ্ধ ফাংশনগুলির । fmapএকটি Maybeমান নিয়ে কাজ করার জন্য একটি ফাংশন রূপান্তরিত হয় :
case maybeVal of
Nothing -> Nothing -- there is nothing, so just return Nothing
Just val -> Just (f val) -- there is a value, so apply the function to it
তাই আপনি যদি একটি আছে Maybe Integerমান m_xএবং Int -> Intফাংশন f, আপনি কি করতে পারেন fmap f m_xফাংশন প্রয়োগ করতেf সরাসরি Maybe Integerউদ্বেজক যদি এটা আসলে একটি মান পেয়েছিলাম বা না ছাড়া। প্রকৃতপক্ষে, আপনি মানগুলিতে উত্তোলিত Integer -> Integerক্রিয়াকলাপগুলির একটি সম্পূর্ণ শৃঙ্খলা প্রয়োগ করতে পারেন Maybe Integerএবং Nothingযখন আপনি শেষ করেছেন তখন কেবল স্পষ্টভাবে পরীক্ষা করার বিষয়ে চিন্তা করতে হবে ।
হয়তো মোনাদ হিসাবে
আপনি Monadএখনও একটি ধারণার সাথে কতটা পরিচিত তা আমি নিশ্চিত নই , তবে আপনি কমপক্ষে IO aআগে ব্যবহার করেছেন , এবং স্বাক্ষর টাইপের স্বরূপ দেখতে খুব কমই IO aমিলছে Maybe a। যদিও IOএটি বিশেষ যে এটি এটির নির্মাণকারীদের আপনার কাছে প্রকাশ করে না এবং এটি হ্যাসেল রানটাইম সিস্টেম দ্বারা কেবল "রান" হতে পারে, এটি এখনও একটিFunctor হওয়ার পাশাপাশি সংযোজন Monad। প্রকৃতপক্ষে, একটি গুরুত্বপূর্ণ ধারণা রয়েছে যার মধ্যে a Monadহ'ল Functorকিছু বিশেষ বৈশিষ্ট্যযুক্ত একটি বিশেষ ধরণের , তবে এটি getোকানোর জায়গা নয়।
যাইহোক, মনডস IOনতুন ধরণের মানচিত্রের পছন্দ করে যা "মানগুলির ফলাফল হিসাবে গণনাগুলি" উপস্থাপন করে এবং আপনি এতে ফাংশন তুলতে পারেনMonad একটি অতি- fmapপছন্দসই ফাংশনটির মাধ্যমে প্রকারভেদে উত্থাপন liftM যা নিয়মিত ফাংশনটিকে "গণনাতে রূপান্তরিত করে" যা মূল্যায়নের মাধ্যমে প্রাপ্ত মানের ফলাফল করে ফাংশন। "
আপনি সম্ভবত অনুমান করেছেন (আপনি যদি এ পর্যন্ত পড়ে থাকেন) Maybeএটিও একটি Monad। এটি এমন "গণনা উপস্থাপন করে যা কোনও মান ফেরত দিতে ব্যর্থ হতে পারে"। fmapউদাহরণের মতোই , এটি আপনাকে প্রতিটি পদক্ষেপের পরে স্পষ্টভাবে ত্রুটিগুলি পরীক্ষা না করে সম্পূর্ণ গণনা করতে দেয়। এবং প্রকৃতপক্ষে, Monadউদাহরণটি যেভাবে নির্মিত হয় , Maybeমানগুলির একটি গণনা বন্ধ হয়ে যায় যত তাড়াতাড়ি একটি Nothingসম্মুখীন হয় তাই এটি একটি তাৎক্ষণিক পরিত্যাগ বা গণনার মাঝখানে একটা মূল্যহীন আগমন মত ধরনের।
আপনি লিখে থাকতে পারে
যেমনটি আমি আগে বলেছি, এর অন্তর্নিহিত কিছুই নেই Maybe ভাষার সিনট্যাক্স বা রানটাইম সিস্টেমে যে ধরণের বেকড রয়েছে তার মধ্যে । যদি হাস্কেল ডিফল্টরূপে এটি সরবরাহ না করে, তবে আপনি তার কার্যকারিতা সমস্ত নিজেরাই সরবরাহ করতে পারেন! আসলে, আপনি এটিকে আবার নিজের নামে আলাদা আলাদা নামের সাথে লিখতে এবং একই কার্যকারিতা পেতে পারেন।
আশা করি আপনি Maybeএখন টাইপ এবং এর নির্মাতাদের বুঝতে পারছেন, তবে এখনও যদি কিছু অস্পষ্ট থাকে তবে আমাকে জানান!
Maybeযেখানে অন্যান্য ভাষাগুলি ব্যবহার করবেnullবাnil(NullPointerExceptionপ্রতিটি কোণে দুষ্টু ছদ্মবেশ সহ )। এখন অন্যান্য ভাষাগুলিও এই কন্সট্রাক্টটি ব্যবহার করা শুরু করে: স্কেল হিসাবেOptionএবং জাভা 8 এরওOptionalটাইপ থাকবে।