এটি প্রকৃতপক্ষে কেবলমাত্র একটি সাধারণ ডেটা কনস্ট্রাক্টর যা প্রিলিউডে সংজ্ঞায়িত করা হয় , এটি স্ট্যান্ডার্ড লাইব্রেরি যা প্রতিটি মডিউলে স্বয়ংক্রিয়ভাবে আমদানি করা হয়।
কি হতে পারে, কাঠামোগত
সংজ্ঞাটি এরকম কিছু দেখায়:
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
টাইপ থাকবে।