হয়তো মোনাদ বনাম ব্যতিক্রম


34

আমি অবাক হয়েছি যে ব্যতিক্রমগুলি থেকে Maybe মনাদের সুবিধাগুলি কী ? দেখে মনে Maybeহচ্ছে এটি try..catchসিনট্যাক্সের স্পষ্ট (এবং বরং স্থান-গ্রহণযোগ্য) উপায় way

আপডেট দয়া করে মনে রাখবেন যে আমি ইচ্ছাকৃতভাবে হাস্কেলের উল্লেখ করছি না

উত্তর:


57

ব্যবহার Maybe(বা তার মামাতো ভাই Eitherযা মূলত একই ভাবে কাজ করে কিন্তু আপনি জায়গায় একটি অবাধ মান দেয় Nothing) ব্যতিক্রম চেয়ে কিছুটা ভিন্ন উদ্দেশ্য করে তোলে। জাভা পদগুলিতে এটি রানটাইম ব্যতিক্রমের চেয়ে পরীক্ষিত ব্যতিক্রমের মতো। এটি প্রত্যাশিত এমন কিছু উপস্থাপন করে যা আপনার মোকাবিলা করতে হবে, আপনি প্রত্যাশিত ত্রুটির পরিবর্তে।

সুতরাং মত একটি ফাংশন indexOfএকটি Maybeমান ফিরে আসবে কারণ আপনি আশা করেন যে আইটেমটি তালিকায় নেই। এটি অনেকটা nullকোনও ফাংশন থেকে ফিরে আসার মতো , কেবলমাত্র কোনও টাইপ-নিরাপদ উপায়ে যা আপনাকে nullমামলা মোকাবেলা করতে বাধ্য করে । Eitherব্যতীত আপনি ত্রুটি ক্ষেত্রে সঙ্গে যুক্ত তথ্য আসতে পারেন যে একই ভাবে কাজ করে, তাই এটা আসলে বেশি ব্যতিক্রম অনুরূপ Maybe

সুতরাং Maybe/ Eitherপদ্ধতির সুবিধা কি ? একটির জন্য, এটি ভাষার প্রথম শ্রেণির নাগরিক। আসুন Eitherএকটি ব্যতিক্রম ছোঁড়া ব্যবহার করে একটি ফাংশন তুলনা করা যাক । ব্যতিক্রম ক্ষেত্রে, আপনার একমাত্র আসল আশ্রয় একটি try...catchবিবৃতি। জন্য Eitherফাংশন, আপনি যদি বিদ্যমান combinators ব্যবহার প্রবাহ নিয়ন্ত্রণ স্বচ্ছ করে তুলতে পারে। এখানে উদাহরণ তুলে ধরা হলো:

প্রথমে ধরা যাক যে আপনি বেশ কয়েকটি ফাংশন চেষ্টা করতে চান যা একটি ক্রমাগত ত্রুটিযুক্ত হতে পারে যতক্ষণ না আপনি এমনটি না পেয়ে পান না। আপনি যদি ত্রুটি ছাড়াই কোনও না পান তবে আপনি একটি বিশেষ ত্রুটি বার্তাটি ফিরিয়ে দিতে চান। এটি আসলে খুব দরকারী প্যাটার্ন তবে এটি ব্যবহারে ভয়াবহ ব্যথা হতে পারে try...catch। আনন্দের, যেহেতু Eitherশুধু একটি স্বাভাবিক মান, আপনি যদি বিদ্যমান ফাংশন কোড অনেক স্বচ্ছ করে তুলতে ব্যবহার করতে পারেন:

firstThing <|> secondThing <|> throwError (SomeError "error message")

অন্য একটি উদাহরণ একটি alচ্ছিক ফাংশন হচ্ছে। আসুন ধরা যাক আপনার চালানোর জন্য বেশ কয়েকটি ফাংশন রয়েছে যা একটি ক্যোয়ারী অনুকূল করার চেষ্টা করে including যদি এটি ব্যর্থ হয় তবে আপনি অন্য যে কোনও উপায়ে চালানো চান। আপনি কোড কিছু লিখতে পারেন:

do a <- getA
   b <- getB
   optional (optimize query)
   execute query a b

এই উভয় ক্ষেত্রেই ব্যবহারের চেয়ে পরিষ্কার এবং খাটো try..catch, এবং আরও গুরুত্বপূর্ণভাবে, আরও শব্দার্থক। সর্বদা ব্যতিক্রমগুলি হ্যান্ডেল করার চেয়ে ব্যবহারের মতো <|>বা optionalআপনার উদ্দেশ্যগুলি আরও পরিষ্কার করে তোলে try...catch

এছাড়াও নোট করুন যে আপনার লাইনের মতো লাইন দিয়ে আপনার কোড লিটার করতে হবে নাif a == Nothing then Nothing else ... ! চিকিত্সা Maybeএবং Eitherএকটি monad হিসাবে পুরো বিষয়টি হ'ল এড়ানো। আপনি বাইন্ড ফাংশনে প্রসারণ শব্দার্থকে এনকোড করতে পারেন যাতে আপনি বিনামুল্যে নাল / ত্রুটি চেক পান। আপনাকে কেবলমাত্র একবার পরিষ্কারভাবে যাচাই করতে হবে যদি আপনি Nothingপ্রদত্ত একটি ব্যতীত অন্য কোনও কিছু ফিরিয়ে দিতে চান Nothingতবে তারপরেও এটি সহজ: সেই কোডটি আরও সুন্দর করার জন্য স্ট্যান্ডার্ড লাইব্রেরি ফাংশনগুলির একটি গুচ্ছ রয়েছে।

শেষ অবধি, আরেকটি সুবিধা হ'ল একটি Maybe/ Eitherপ্রকারটি কেবল সহজ। অতিরিক্ত কীওয়ার্ড বা নিয়ন্ত্রণ কাঠামো সহ ভাষা প্রসারিত করার দরকার নেই - সবকিছু কেবল একটি লাইব্রেরি। যেহেতু এগুলি কেবলমাত্র সাধারণ মান, তাই এটি টাইপ সিস্টেমটিকে সহজতর করে তোলে - জাভাতে, আপনাকে প্রকারের (যেমন: রিটার্নের ধরণ) এবং প্রভাবগুলির (উদাহরণস্বরূপ throwsবিবৃতি) এর মধ্যে পার্থক্য করতে হবে যেখানে আপনি ব্যবহার করছেন না Maybe। তারা অন্য যে কোনও ব্যবহারকারী-সংজ্ঞায়িত প্রকারের মতোই আচরণ করে - ভাষায় বিশেষ ত্রুটি-পরিচালনা করার কোডের দরকার নেই।

আর একটি জয় হ'ল Maybe/ Eitherফান্টেক্টর এবং মোনাদ, যার অর্থ তারা বিদ্যমান মোনাড কন্ট্রোল ফ্লো ফাংশনগুলি (যার মধ্যে একটি মোটামুটি সংখ্যা রয়েছে) এর সুবিধা নিতে পারে এবং সাধারণভাবে, অন্যান্য মনাদের সাথে সুন্দরভাবে খেলতে পারে।

বলেছিল, কিছু ক্যাভেট রয়েছে। একটির জন্য, চেক করা ব্যাতিক্রমণ Maybeবা Eitherপ্রতিস্থাপন করুন না । 0 দিয়ে ভাগ করার মতো জিনিসগুলি পরিচালনা করার জন্য আপনি অন্য কোনও উপায় চাইবেন কেবল কারণ প্রতিটি একক বিভাগের একটি Maybeমূল্য ফেরত পাওয়া ব্যথা হবে ।

অন্য সমস্যাটিতে একাধিক ধরণের ত্রুটি ফিরে আসা (এটি কেবল প্রযোজ্য Either)। ব্যতিক্রম সহ, আপনি একই ফাংশনে কোনও ব্যতিক্রম বিভিন্ন ধরণের নিক্ষেপ করতে পারেন। সাথে Either, আপনি কেবল এক প্রকার পান। এটি উপ-টাইপিং বা এডিটি দিয়ে কন্সট্রাক্টর হিসাবে সমস্ত ধরণের ত্রুটিযুক্ত (যা এই দ্বিতীয় পদ্ধতিটি সাধারণত হাস্কেলের ক্ষেত্রে সাধারণত ব্যবহৃত হয়) দিয়ে পারা যায়।

তবুও, সর্বোপরি, আমি Maybe/ Eitherপদ্ধতির পছন্দ করি কারণ আমি এটিকে সহজ এবং আরও নমনীয় মনে করি।


বেশিরভাগ ক্ষেত্রে সম্মত, তবে আমি মনে করি না যে "alচ্ছিক" উদাহরণটি অর্থবোধ করে - মনে হচ্ছে আপনি যেমন ব্যতিক্রমগুলি করতে পারেন ঠিক তেমন: অকার্যকর ptionচ্ছিক (ক্রিয়া আইন) {চেষ্টা করুন {আইন (); } ধরা (ব্যতিক্রম) {}}
এরিয়ারসটজ

11
  1. একটি ব্যতিক্রম সমস্যার উত্স সম্পর্কে আরও তথ্য বহন করতে পারে। OpenFile()নিক্ষেপ করতে পারেন FileNotFoundবা NoPermissionবা TooManyDescriptorsইত্যাদি কোনটি এই তথ্য বহন করে না।
  2. ব্যতিক্রমগুলি প্রাসঙ্গিক ক্ষেত্রে ব্যবহার করা যেতে পারে যা প্রত্যাবর্তনের মানগুলির অভাব রয়েছে (যেমন তাদের ভাষাগুলিতে নির্মাণকারীদের সাথে)।
  3. একটি ব্যতিক্রম আপনাকে if None return Noneস্টাইলের প্রচুর বিবরণ ছাড়াই খুব সহজেই স্ট্যাকের তথ্য প্রেরণ করতে দেয় ।
  4. ব্যতিক্রম হ্যান্ডলিং প্রায় সবসময় কেবল একটি মান ফেরত দেওয়ার চেয়ে উচ্চতর পারফরম্যান্স প্রভাব বহন করে।
  5. সর্বাধিক গুরুত্বপূর্ণ বিষয়, একটি ব্যতিক্রম এবং একটি মোনাদ বিভিন্ন উদ্দেশ্য থাকতে পারে - একটি ব্যতিক্রম একটি সমস্যা বোঝাতে ব্যবহৃত হয়, এবং সম্ভবত না হয়।

    "নার্স, 5 রুমে যদি কোনও রোগী থাকে, আপনি কি তাকে অপেক্ষা করতে বলতে পারেন?"

    • মোনাদ হতে পারে: "ডাক্তার, 5 ঘরে কোনও রোগী নেই।"
    • ব্যতিক্রম: "ডাক্তার, রুম নেই 5!"

    ("যদি" লক্ষ্য করুন - এর অর্থ ডাক্তার সম্ভবত মোনাদ আশা করছেন )


7
আমি 2 এবং 3 পয়েন্টগুলির সাথে একমত নই। বিশেষত, 2 ভাষাগুলিতে স্নাদ ব্যবহার করা ভাষায় আসলেই সমস্যা তৈরি করে না কারণ সেই ভাষাগুলির এমন কনভেনশন রয়েছে যা নির্মাণের সময় ব্যর্থতা হ্যান্ডেল করার সমস্যা তৈরি করে না। 3 সম্পর্কিত, স্নাতকের সাথে ভাষাগুলিতে স্বচ্ছ উপায়ে ম্যানডগুলি পরিচালনা করার জন্য উপযুক্ত সিনট্যাক্স রয়েছে যাতে সুস্পষ্ট চেকিংয়ের প্রয়োজন হয় না (উদাহরণস্বরূপ, Noneমানগুলি কেবল প্রচার করা যায়)। আপনার পঞ্চম বিন্দুটি কেবল এক প্রকারের সঠিক ... প্রশ্নটি হল: কোন পরিস্থিতিটি স্পষ্টতই ব্যতিক্রমী? এটি সক্রিয় হিসাবে ... অনেক না
কনরাড রুডল্ফ

3
(২) সম্পর্কিত, আপনি bindএমনভাবে লিখতে পারেন যে পরীক্ষার জন্য Noneকোনও সিনট্যাকটিক ওভারহেড ব্যয় হয় না। একটি খুব সাধারণ উদাহরণ, সি # Nullableঅপারেটরদের যথাযথভাবে ওভারলোড করে । Noneপ্রকারটি ব্যবহার করার পরেও প্রয়োজনীয় পরীক্ষা করার দরকার নেই । অবশ্যই চেকটি এখনও সম্পন্ন হয়েছে (এটি নিরাপদ প্রকারের), তবে পর্দার আড়ালে রয়েছে এবং আপনার কোডটিকে বিশৃঙ্খলা করবে না। (5) আমার আপত্তি সম্পর্কে আপনার আপত্তিতে কিছুটা একই অর্থে প্রযোজ্য তবে আমি সম্মত হই যে এটি সর্বদা প্রযোজ্য নাও হতে পারে।
কনরাড রুডলফ

4
@ ওক: (3) সম্পর্কিত, Maybeমোনাড হিসাবে চিকিত্সার পুরো বিষয়টি হ'ল প্রচারকে Noneনিখুঁতভাবে তৈরি করা। এর অর্থ এই যে আপনি Noneপ্রদত্ত ফিরিয়ে দিতে চান None, আপনাকে কোনও বিশেষ কোড লিখতে হবে না। আপনি যদি বিশেষ কিছু করতে চান তবে আপনাকে কেবলমাত্র মিলানোর প্রয়োজন None। আপনার কখনও if None then Noneবাছাই বাছাইয়ের দরকার নেই ।
টিখন জেলভিস

5
@ ওক: এটি সত্য, তবে এটি আসলে আমার বক্তব্য ছিল না। আমি যা বলছি তা হ'ল আপনি নিখরচায়null (যেমন if Nothing then Nothing) নিখরচায় পরীক্ষা করতে পারেন কারণ Maybeএটি একটি মোনাড। এটি বাইন্ডের সংজ্ঞা ( >>=) এর জন্য এনকোডযুক্ত Maybe
টিখন জেলভিস

2
এছাড়াও, (1) সম্পর্কিত: আপনি সহজেই এমন একটি মোনাড লিখতে পারেন যা ত্রুটির তথ্য বহন করতে পারে (যেমন Either) ঠিক ঠিক মতো আচরণ করে Maybe। দুজনের মধ্যে স্যুইচিং করা আসলে বরং সহজ কারণ Maybeসত্যই এটির একটি বিশেষ ঘটনা Either। (হাস্কেল-তে, আপনি Maybeযেমনটি ভাবতে পারেন Either ())
টিখন জেলভিস

6

"হতে পারে" ব্যতিক্রমগুলির জন্য প্রতিস্থাপন নয়। ব্যতিক্রমগুলি ব্যতিক্রমী ক্ষেত্রে ব্যবহৃত হতে বোঝানো হয় (উদাহরণস্বরূপ: একটি ডিবি সংযোগ খোলার এবং এটি হওয়া উচিত যদিও ডিবি সার্ভার নেই)। "হতে পারে" এমন একটি পরিস্থিতি মডেলিংয়ের জন্য যখন আপনার বৈধ মান থাকতে পারে বা নাও থাকতে পারে; বলুন যে আপনি কোনও চাবির জন্য অভিধান থেকে একটি মূল্য পেয়ে যাচ্ছেন: এটি উপস্থিত থাকতে পারে বা নাও হতে পারে - এর ফলাফলগুলির মধ্যে কোনও "ব্যতিক্রমী" কিছুই নেই।


2
আসলে, আমার কাছে অভিধানের সাথে জড়িত কোডগুলির একটি বিট রয়েছে যেখানে একটি অনুপস্থিত কী মানে জিনিসটি কিছু সময়ে ভয়াবহভাবে ভুল হয়ে গেছে, সম্ভবত আমার কোডে বা কোডে একটি বাগ রয়েছে যা ইনপুটটিকে সেই বিন্দুতে যে কোনও কিছুতে ব্যবহৃত হয় তা রূপান্তরিত করে।

3
@ ডেলানান: আমি বলছি না যে একটি অনুপস্থিত মান কখনও ব্যতিক্রমী রাষ্ট্রের লক্ষণ হতে পারে না - এটি কেবল হবে না। সম্ভবত সত্যিকার অর্থে এমন একটি পরিস্থিতি মডেল করে যেখানে ভেরিয়েবলের একটি বৈধ মান থাকতে পারে বা নাও থাকতে পারে - সি # তে ন্যূনতম প্রকারগুলি ভাবেন।
নেমানজা ত্রিফুনোভিচ

6

আমি টিখনের জবাব দ্বিতীয়, কিন্তু আমি মনে করি একটি খুব গুরুত্বপূর্ণ ব্যবহারিক বিন্দু যে সবাই অনুপস্থিত:

  1. কমপক্ষে মূলধারার ভাষাগুলিতে ব্যতিক্রম হ্যান্ডলিং প্রক্রিয়াগুলি পৃথক থ্রেডের সাথে অন্তরঙ্গভাবে মিলিত হয়।
  2. Eitherপ্রক্রিয়া আদৌ থ্রেড করতে মিলিত হয় না।

তাই আমরা আজকাল বাস্তব জীবনে যা দেখছি তা হ'ল অনেকগুলি অ্যাসিনক্রোনাস প্রোগ্রামিং সলিউশন Eitherত্রুটি পরিচালনার স্টাইলের একটি রূপ গ্রহণ করে । জাভাস্ক্রিপ্ট প্রতিশ্রুতি বিবেচনা করুন , এই লিঙ্কগুলির যে কোনওটিতে বিশদ হিসাবে:

প্রতিশ্রুতিগুলির ধারণা আপনাকে এ জাতীয় অ্যাসিক্রোনাস কোডটি লিখতে দেয় (শেষ লিঙ্ক থেকে নেওয়া):

var greetingPromise = sayHello();
greetingPromise
    .then(addExclamation)
    .then(function (greeting) {
        console.log(greeting);    // 'hello world!!!!’
    }, function(error) {
        console.error('uh oh: ', error);   // 'uh oh: something bad happened’
    });

মূলত, প্রতিশ্রুতি এমন একটি বস্তু যা:

  1. একটি অ্যাসিনক্রোনাস গণনার ফলাফলের প্রতিনিধিত্ব করে, যা এখনও শেষ বা নাও হতে পারে;
  2. এর ফলাফলটি সম্পাদন করার জন্য আপনাকে আরও ক্রিয়াকলাপ চালানোর অনুমতি দেয় যা ফলাফল যখন পাওয়া যায় তখন ট্রিগার হবে এবং যার ফলশ্রুতি প্রতিশ্রুতি হিসাবে উপলব্ধ;
  3. আপনাকে একটি ব্যর্থ হ্যান্ডলারকে সংযুক্ত করার অনুমতি দেয় যা প্রতিশ্রুতির গণনা ব্যর্থ হলে অনুরোধ করা হবে। যদি কোনও হ্যান্ডলার না থাকে তবে ত্রুটিটি পরবর্তী সময়ে হ্যান্ডলারের শৃঙ্খলে প্রচার করা হয়।

মূলত, যেহেতু একাধিক থ্রেড জুড়ে আপনার গণনাটি ঘটে তখন ভাষার আদি ব্যতিক্রম সমর্থনটি কার্যকর হয় না, সুতরাং প্রতিশ্রুতি বাস্তবায়নের ক্ষেত্রে একটি ত্রুটি-পরিচালনা ব্যবস্থা প্রদান করতে হবে, এবং এগুলি হ্যাস্কেলের Maybe/ Eitherপ্রকারের মতো সান্দ্র হতে পারে ।


থ্রেড সহ এটির কিছুই করার নেই। ব্রাউজারে জাভাস্ক্রিপ্ট সর্বদা এক থ্রেডে চালিত হয় একাধিক থ্রেডে নয়। তবে আপনি এখনও ব্যতিক্রম ব্যবহার করতে পারবেন না কারণ ভবিষ্যতে আপনার ফাংশনটি কখন ডাকা হবে তা আপনি জানেন না। অ্যাসিঙ্ক্রোনাসের অর্থ স্বয়ংক্রিয়ভাবে থ্রেডগুলির সাথে জড়িত থাকার অর্থ নয়। আপনি ব্যতিক্রম নিয়ে কাজ করতে না পারার কারণও এটি। আপনি যদি কোনও ফাংশন কল করেন এবং তাত্ক্ষণিকভাবে এটি কার্যকর হয় তবে আপনি কেবলমাত্র ব্যতিক্রম পেতে পারেন। তবে অ্যাসিনক্রোনাসের পুরো উদ্দেশ্যটি হ'ল এটি ভবিষ্যতে চালিত হয়, প্রায়শই যখন অন্য কোনও কিছু শেষ হয়, এবং অবিলম্বে না not এজন্য আপনি সেখানে ব্যতিক্রম ব্যবহার করতে পারবেন না।
ডেভিড রবাব

1

হাস্কেল টাইপ সিস্টেমে ব্যবহারকারীকে একটি সম্ভাবনার স্বীকৃতি জানাতে হবে Nothing, যদিও প্রোগ্রামিং ভাষাগুলি প্রায়শই ব্যতিক্রম ধরা পড়ে না। এর অর্থ হ'ল সংকলনকালে আমরা জানব যে ব্যবহারকারী কোনও ত্রুটির জন্য পরীক্ষা করেছে।


1
জাভাতে চেক ব্যতিক্রম আছে। এবং লোকেরা প্রায়শই তাদের সাথে খারাপ ব্যবহার করে।
ভ্লাদিমির

1
@ ডায়ার্ট'আর্ট বাটজাভা আইও ত্রুটির (উদাহরণ হিসাবে) তদন্তের প্রয়োজন, তবে এনপিই-র জন্য নয়। হাসকেলে এটি অন্য উপায়ে রয়েছে: নাল সমতুল্য (সম্ভবত) চেক করা হয়েছে তবে আইও ত্রুটিগুলি কেবল ব্যতিক্রমগুলি ছুঁড়ে ফেলেছে। আমি কতটা পার্থক্য তৈরি তা সম্পর্কে নিশ্চিত নই, তবে হাসকলাররা সম্ভবত অভিযোগ করার অভিযোগ শুনতে পাচ্ছি না এবং আমি মনে করি যে অনেক লোক এনপিইগুলি চেক করা উচিত।

1
@ ডেলান মানুষ কি এনপিই চেক করতে চান? তাদের অবশ্যই পাগল হওয়া উচিত। এবং আমি বলতে চাই। এনপিই চেক করা কেবল তখনই বোধগম্য হয় যদি আপনার কাছে প্রথমে এড়িয়ে যাওয়ার কোনও উপায় থাকে (জাভা নয় এমন অ-রেফারেন্স উল্লেখ করে)।
কনরাড রুডল্ফ

5
@ কনরাড রুডল্ফ হ্যাঁ, লোকেরা সম্ভবত এটি এই অর্থে পরীক্ষা করা উচিত নয় যে তাদের throws NPEপ্রত্যেকটি স্বাক্ষর এবং catch(...) {throw ...} প্রতিটি একক পদ্ধতিতে একটি সংযুক্ত করতে হবে। তবে আমি বিশ্বাস করি যে একই রকম অর্থে চেক করার জন্য বাজার রয়েছে যেমন: হতে পারে: অকার্যকরতা alচ্ছিক এবং টাইপ সিস্টেমে ট্র্যাক।

1
@ ডেলান আহ, তাহলে আমি সম্মত হই।
কনরাড রুডল্ফ

0

সম্ভবত মোনাড মূলত মূলধারার ভাষার "নাল মানে ত্রুটি" পরীক্ষা করা (যা নালটি পরীক্ষা করার প্রয়োজন হয় তা বাদ দিয়ে) ব্যবহার করার মতো এবং এটির মূলত একই সুবিধা এবং অসুবিধা রয়েছে।


8
ওয়েল, এটা না না একই অসুবিধেও যেহেতু এটি স্ট্যাটিক্যালি যখন সঠিকভাবে ব্যবহৃত চেক করা টাইপ হতে পারেন। সম্ভবত ম্যানড ব্যবহার করার সময় নাল পয়েন্টার ব্যতিক্রমের সমতুল্য নেই (আবার, ধরে নিবেন যে তারা সঠিকভাবে ব্যবহৃত হয়েছে)।
কনরাড রুডল্ফ

প্রকৃতপক্ষে. আপনি কীভাবে এটি স্পষ্ট করা উচিত বলে মনে করেন?
তেলস্তিন

@ কনরাড এর কারণ এটি হতে পারে যে সম্ভবত (সম্ভবত) মানটি ব্যবহার করার জন্য আপনাকে অবশ্যই কোনওটির জন্য চেক করতে হবে (যদিও অবশ্যই এই চেকিংয়ের অনেকগুলি স্বয়ংক্রিয় করার ক্ষমতা রয়েছে)। অন্যান্য ভাষাগুলি এই ধরণের জিনিসটিকে ম্যানুয়াল রাখে (বেশিরভাগ ক্ষেত্রে আমি বিশ্বাস করি যে দার্শনিক কারণে)।
ডোনাল ফেলো

2
@ ডোনাল হ্যাঁ তবে নোট করুন যে বেশিরভাগ ভাষাগুলি যে মনাদগুলি প্রয়োগ করে উপযুক্ত সিনট্যাকটিক চিনি সরবরাহ করে যাতে এই চেকটি প্রায়শই সম্পূর্ণ লুকিয়ে রাখা যায়। যেমন আপনি মাত্র দুই যোগ করতে পারেন Maybeলেখা দ্বারা সংখ্যার a + b ছাড়া জন্য চেক করতে হবে None, এবং এর ফলে আবার একটি ঐচ্ছিক মান।
কনরাড রুডলফ

2
Nullable ধরনের সঙ্গে তুলনা জন্য কথা সত্য Maybe টাইপ , কিন্তু ব্যবহার Maybeএকটি একসংখ্যা যেমন সিনট্যাক্স চিনি যে প্রকাশ অনুমতি দেয় আরো অনেক এইরূপ সূচারূভাবে নাল পর যুক্তিবিজ্ঞান যোগ করা হয়েছে।
tmadmers

0

ব্যতিক্রম হ্যান্ডলিং ফ্যাক্টরিং এবং টেস্টিংয়ের জন্য সত্যিকারের ব্যথা হতে পারে। আমি জানি পাইথন সিঁটেক্সের সাথে দুর্দান্ত "উইথ" সরবরাহ করে যা আপনাকে কঠোর "চেষ্টা করুন ... ধরা" ব্লক ব্যতীত ব্যতিক্রমগুলিকে ফাঁদে ফেলতে দেয়। তবে জাভাতে, উদাহরণস্বরূপ, ক্যাচ ব্লকগুলি বড়, বয়লারপ্লেট, হয় ভার্বোস বা চূড়ান্ত ভার্বোস এবং বিরতিতে শক্ত। তার উপরে, জাভা চেক করা বনাম, চেক করা ব্যতিক্রমগুলির চারপাশে সমস্ত গোলমাল যুক্ত করে।

পরিবর্তে, যদি আপনার মোনাড ব্যতিক্রমগুলি ধরে ফেলে এবং এগুলিকে একজাতীয় স্থানের সম্পত্তি হিসাবে বিবেচনা করে (কিছু প্রক্রিয়াজাতকরণের পরিবর্তে) তবে আপনি যে স্থানটিতে নিক্ষেপ করেন বা ধরেন না কেন আপনি সেই স্থানটিতে মিশ্রিত এবং ফাংশনগুলি মেলাতে পারবেন।

যদি আরও ভাল হয় তবে আপনার মোনাড এমন পরিস্থিতিতে বাধা দেয় যেখানে ব্যতিক্রমগুলি ঘটতে পারে (যেমন নাল চেক করতে পারে সম্ভবত), যদি ... তবে চেষ্টা করার চেয়ে পরীক্ষার চেয়ে আরও বেশি ফ্যাক্টর এবং টেস্ট করা সহজ ...

আমি যা দেখেছি সেখান থেকে প্রতিটি ফাংশন প্রত্যাবর্তন করে (উত্তর, ত্রুটি) নির্দিষ্ট করে একই ধরণের পন্থা নিচ্ছে। এটি একটি মোনাডে ফাংশনটি "উত্তোলন" হিসাবে সমান, যেখানে মূল উত্তর ধরণের একটি ত্রুটির ইঙ্গিত দিয়ে সজ্জিত করা হয়, এবং কার্যকরভাবে পার্শ্ব-পদক্ষেপ নিক্ষেপ এবং ব্যতিক্রমী ধরা।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.