ঠিক আছে, হাসকেলে ত্রুটি পরিচালনা করার প্রথম নিয়ম: কখনই ব্যবহার করবেন নাerror
।
এটি প্রতিটি উপায়ে কেবল ভয়ঙ্কর। এটি ইতিহাসের একটি ক্রিয়াকলাপ হিসাবে বিশুদ্ধরূপে বিদ্যমান এবং প্রিলিড এটি ব্যবহার করে তা সত্যই ভয়ানক। এটি ব্যবহার করবেন না।
আপনি কেবলমাত্র এটি ব্যবহার করতে পারবেন যখন কোনও অভ্যন্তরীণভাবে এত ভয়াবহ হয় যে বাস্তবের খুব ফ্যাব্রিকের সাথে কোনও কিছু ভুল হতেই পারে, এইভাবে আপনার প্রোগ্রামের ফলাফলটি উপস্থাপন করতে পারে।
এখন প্রশ্ন Maybe
বনাম হয়ে যায় Either
। Maybe
এটি এমন head
কোনও কিছুর সাথে সুন্দরভাবে উপযুক্ত , যা কোনও মান প্রত্যাবর্তন করতে পারে বা নাও পারে তবে ব্যর্থ হওয়ার একমাত্র সম্ভাব্য কারণ রয়েছে। Nothing
"এটি ভেঙে গেছে, এবং এর কারণ আপনি ইতিমধ্যে জানেন" এর মতো কিছু বলছে। কেউ কেউ বলবেন এটি একটি আংশিক ফাংশন নির্দেশ করে।
ত্রুটি পরিচালনার সর্বাধিক শক্তিশালী ফর্মটি হ'ল Either
+ একটি ত্রুটি ADT।
উদাহরণস্বরূপ আমার শখের একটি সংকলকের মধ্যে আমার মতো কিছু রয়েছে
data CompilerError = ParserError ParserError
| TCError TCError
...
| ImpossibleError String
data ParserError = ParserError (Int, Int) String
data TCError = CouldntUnify Ty Ty
| MissingDefinition Name
| InfiniteType Ty
...
type ErrorM m = ExceptT CompilerError m -- from MTL
এখন আমি একগুচ্ছ ত্রুটির ধরণগুলি সংজ্ঞায়িত করি, তাদের বাসা বেঁধে রাখি যাতে আমার একটি শীর্ষস্থানীয় ত্রুটি ত্রুটি থাকে। এটি সংকলনের কোনও পর্যায়ে বা একটি থেকে ত্রুটি হতে পারে ImpossibleError
, যা একটি সংকলক বাগ চিহ্নিত করে if
এই ত্রুটির ধরণের প্রতিটি প্রিন্ট মুদ্রণ বা অন্যান্য বিশ্লেষণের জন্য যথাসম্ভব যতটা তথ্য রাখার চেষ্টা করে। আরও গুরুত্বপূর্ণ, স্ট্রিং না করে আমি পরীক্ষা করতে পারি যে টাইপ চেকারের মাধ্যমে একটি অসম্পূর্ণ প্রোগ্রাম চালানো আসলে একটি একীকরণ ত্রুটি তৈরি করে! একবার কিছু হয়ে গেলে String
তা চিরতরে চলে যায় এবং এতে থাকা যে কোনও তথ্যই সংকলক / পরীক্ষাগুলির কাছে অস্বচ্ছ, সুতরাং কেবল Either String
দুর্দান্ত নয়।
অবশেষে আমি ExceptT
এমটিএল থেকে একটি নতুন মোনাড ট্রান্সফর্মার মধ্যে এই ধরণের প্যাক । এটি মূলত EitherT
এবং শুদ্ধ, মনোরম উপায়ে ত্রুটিগুলি ছুঁড়ে ফেলার জন্য এবং ধরে রাখার জন্য একটি দুর্দান্ত ব্যাচের সাথে আসে।
অবশেষে, এটা মূল্য উল্লেখ করে Haskell, হ্যান্ডলিং ব্যতিক্রম সমর্থন করার জন্য মত অন্যান্য ভাষায় না, ছাড়া একটি ব্যতিক্রম জীবন সংক্রামক মেকানিজম রয়েছে IO
। আমি জানি কিছু লোক IO
ভারী অ্যাপ্লিকেশনগুলির জন্য এগুলি ব্যবহার করতে পছন্দ করেন যেখানে সমস্ত কিছু সম্ভাব্যভাবে ব্যর্থ হতে পারে তবে এত কম সময়েই তারা এ সম্পর্কে ভাবতে পছন্দ করেন না। আপনি এই অপরিষ্কার ব্যতিক্রমগুলি ব্যবহার করেন বা ন্যায়সঙ্গত ExceptT Error IO
সত্যই স্বাদের বিষয়। আমি ExceptT
ব্যর্থতার সম্ভাবনার কথা মনে করিয়ে দেওয়া পছন্দ করি বলে ব্যক্তিগতভাবে আমি নির্বাচন করি।
সংক্ষিপ্তসার হিসাবে,
Maybe
- আমি এক সুস্পষ্ট উপায়ে ব্যর্থ হতে পারি
Either CustomType
- আমি ব্যর্থ হতে পারি, এবং আমি আপনাকে বলব কী ঘটেছে
IO
+ ব্যতিক্রম - আমি মাঝে মাঝে ব্যর্থ হই। আমি যখন করি তখন আমি কী নিক্ষেপ করি তা দেখতে আমার ডক্স পরীক্ষা করে দেখুন
error
- আমি আপনাকে খুব ঘৃণা করি
head
বাlast
ব্যবহারযোগ্য বলে মনে হচ্ছেerror
, তাই আমি ভাবছিলাম যে এটি আসলে জিনিসগুলি করার একটি ভাল উপায় এবং আমি কেবল কিছু মিস করছি। এই প্রশ্নের উত্তর। :)