এখানে হাস্কেল কীভাবে তা করেন তা এখানে রয়েছে: (হাস্পেল কোনও বস্তু-ওরিয়েন্টেড ভাষা না হওয়ায় লিপার্টের বক্তব্যের ঠিক পাল্টা নয়)।
সতর্কতা: সামনে একটি গুরুতর হাস্কেল ফ্যানবয়ের কাছ থেকে দীর্ঘ বায়ুযুক্ত উত্তর।
টি এল; ডিআর
এই উদাহরণটি তুলে ধরেছে যে হাস্কেল সি # এর থেকে ঠিক কতটা পৃথক। কাঠামো নির্মাণের লজিস্টিক কোনও কনস্ট্রাক্টরকে অর্পণ করার পরিবর্তে, এটি অবশ্যই আশেপাশের কোডগুলিতে পরিচালনা করা উচিত। নাল (বা Nothing
হাস্কেলের মধ্যে) মান মূল্য কাটাবার কোনও উপায় নেই যেখানে আমরা নন-নাল মান প্রত্যাশা করি কারণ নাল মানগুলি কেবলমাত্র এমন বিশেষ মোড়কের ধরণের মধ্যে দেখা যায় Maybe
যা নিয়মিত, অ- nullable প্রকার। এটিকে মোড়কের মাধ্যমে নোলযোগ্য কোনও মান ব্যবহার করতে Maybe
, আমাদের প্রথমে প্যাটার্ন ম্যাচিংয়ের সাহায্যে মানটি বের করতে হবে, যা আমাদের নিয়ন্ত্রণের প্রবাহকে এমন একটি শাখায় রূপান্তর করতে বাধ্য করে যেখানে আমরা নিশ্চিতভাবে জানি যে আমাদের নন-মান রয়েছে।
অতএব:
আমরা কি সর্বদা জানতে পারি যে একটি অ-অযোগ্য রেফারেন্স কখনই অবৈধ হিসাবে পরিলক্ষিত হয় না?
হ্যাঁ. Int
এবং Maybe Int
দুটি সম্পূর্ণ পৃথক ধরনের। খোঁজা Nothing
একটি প্লেইন মধ্যে Int
একটি ইন STRING "মাছ" খোঁজার তুলনীয় হবে Int32
।
রেফারেন্স প্রকারের একটি অ-অযোগ্য ক্ষেত্রের সাথে কোনও অবজেক্টের কনস্ট্রাক্টর সম্পর্কে কী বলা যায়?
কোনও সমস্যা নয়: হাস্কেলের মান নির্মাতারা তাদের প্রদত্ত মানগুলি গ্রহণ করতে এবং সেগুলি একত্রে রেখে কিছু করতে পারে না। কনস্ট্রাক্টর ডাকা হওয়ার আগে সমস্ত সূচনা যুক্তি ঘটে।
এই জাতীয় অবজেক্টের চূড়ান্তকরণের বিষয়ে কী, যেখানে রেফারেন্সটি পূরণ করার কথা বলে এমন কোডটি ব্যতিক্রম ছুঁড়েছিল বলে এই বিষয়টিকে চূড়ান্ত করা হয়েছে?
হাস্কেলে কোনও চূড়ান্তকরণকারী নেই, তাই আমি সত্যিই এটির সমাধান করতে পারি না। আমার প্রথম প্রতিক্রিয়াটি এখনও রয়েছে।
পূর্ণ উত্তর :
হাস্কেলের কোনও নাল নেই এবং Maybe
নলগুলি উপস্থাপন করতে ডেটা টাইপ ব্যবহার করে । হতে পারে এটির মতো সংজ্ঞায়িত একটি আলগ্যাব্রিক ডেটা টাইপ :
data Maybe a = Just a | Nothing
আপনারা যারা হাস্কেলের সাথে অপরিচিত, তাদের জন্য এটি "এ Maybe
হয় হয় হয় Nothing
বা একটি Just a
" হিসাবে পড়ুন। বিশেষ করে:
Maybe
এটি টাইপ কনস্ট্রাক্টর : এটিকে জেনেরিক ক্লাস হিসাবে (ভুলভাবে) ভাবা যায় (যেখানে a
টাইপ ভেরিয়েবল হয়)। সি # উপমাটি হ'ল class Maybe<a>{}
।
Just
একটি মান নির্মাতা : এটি এমন একটি ফাংশন যা প্রকারের একটি আর্গুমেন্ট নেয় a
এবং Maybe a
এমন ধরণের মান প্রদান করে যা মান থাকে। কোডটি x = Just 17
সাদৃশ্যপূর্ণ int? x = 17;
।
Nothing
অন্য মান নির্মাতা, তবে এটি কোনও আর্গুমেন্ট নেয় না এবং Maybe
প্রত্যাবর্তনের "কিছুই না" ব্যতীত অন্য কোনও মান থাকে না। x = Nothing
অনুরূপ int? x = null;
(অভিমানী আমরা আমাদের সীমাবদ্ধ a
মধ্যে Haskell হতে Int
লেখা দ্বারা সম্পন্ন করা যেতে পারে x = Nothing :: Maybe Int
)।
এখন যে Maybe
ধরণের বেসিকগুলি বাইরে চলে গেছে, হাসেল কীভাবে ওপির প্রশ্নে আলোচিত বিষয়গুলি এড়াতে পারে?
ওয়েল, Haskell, হয় সত্যিই ভাষায় এতদূর আলোচনা বেশীর ভাগের থেকেই আলাদা, তাই আমি কয়েকটি সাধারণ ভাষা নীতির ব্যাখ্যা দ্বারা আরম্ভ করব।
প্রথম প্রথম, হাস্কেলগুলিতে, সমস্ত কিছুই অপরিবর্তনীয় । সব। নামগুলি মানগুলি উল্লেখ করে, মেমোরি অবস্থানগুলিতে নয় যেখানে মানগুলি সংরক্ষণ করা যেতে পারে (এটি একা এটি বাগ নির্মূলের এক বিরাট উত্স)। সি #, যেখানে পরিবর্তনশীল ঘোষণা এবং নিয়োগ দুটি পৃথক অভিযান Haskell, মানের মধ্যে তাদের মূল্য নির্ধারক দ্বারা তৈরি করা হয় হয় ভিন্ন (যেমন x = 15
, y = "quux"
, z = Nothing
), পরিবর্তন করতে পারে। সুতরাং, কোড যেমন:
ReferenceType x;
হাস্কেলে সম্ভব নয়। মানগুলি আরম্ভ করার ক্ষেত্রে কোনও সমস্যা নেই null
কারণ এটি বিদ্যমান থাকার জন্য সবকিছুকে স্পষ্টভাবে একটি মানের সাথে আরম্ভ করতে হবে।
দ্বিতীয়ত, হাস্কেল কোনও বস্তু-কেন্দ্রিক ভাষা নয় : এটি নিখুঁতভাবে কার্যকরী ভাষা, সুতরাং শব্দের কঠোর অর্থে কোনও বস্তু নেই। পরিবর্তে, কেবলমাত্র ফাংশন (মান নির্মাতারা) রয়েছে যা তাদের আর্গুমেন্ট গ্রহণ করে এবং একত্রিত কাঠামো দেয়।
এরপরে, একেবারে কোনও প্রয়োজনীয় স্টাইল কোড নেই। এর মাধ্যমে, আমার অর্থ এই যে বেশিরভাগ ভাষা এই ধরণের কিছু অনুসরণ করে:
do thing 1
add thing 2 to thing 3
do thing 4
if thing 5:
do thing 6
return thing 7
প্রোগ্রামের আচরণটি নির্দেশের একটি ধারা হিসাবে প্রকাশ করা হয়। অবজেক্ট-ওরিয়েন্টেড ভাষায়, শ্রেণি এবং ফাংশন ঘোষণাগুলি প্রোগ্রাম প্রবাহেও বিশাল ভূমিকা পালন করে, তবে মূলত, কোনও প্রোগ্রামের সম্পাদনের "মাংস" কার্যকর করার জন্য বিভিন্ন সিরিজের নির্দেশিকা রূপ নেয়।
হাস্কেলে, এটি সম্ভব নয়। পরিবর্তে, প্রোগ্রাম ফ্লো পুরোপুরি ফাংশন শৃঙ্খলা দ্বারা নির্ধারিত হয়। এমনকি অপরিহার্য- do
সন্ধানকারী - নোটেশনটি >>=
অপারেটরের কাছে বেনাম ফাংশনগুলি প্রেরণের জন্য কেবল সিনট্যাকটিক চিনি । সমস্ত ফাংশন এর রূপ নেয়:
<optional explicit type signature>
functionName arg1 arg2 ... argn = body-expression
যেখানে body-expression
কোনও মান যা মূল্যায়ন করে তা হতে পারে। স্পষ্টতই আরও সংশ্লেষের বৈশিষ্ট্য উপলব্ধ রয়েছে তবে মূল বিষয়টি হ'ল বক্তব্যের ক্রমগুলির সম্পূর্ণ অনুপস্থিতি।
শেষ পর্যন্ত এবং সম্ভবত সবচেয়ে গুরুত্বপূর্ণ, হাস্কেলের টাইপ সিস্টেমটি অবিশ্বাস্যভাবে কঠোর। যদি আমাকে হাস্কেলের টাইপ সিস্টেমের কেন্দ্রীয় নকশা দর্শনের সংক্ষিপ্ত বিবরণ জানাতে হয়, তবে আমি বলব: "সংকলনের সময় যতটা সম্ভব সম্ভব ভুল করা যাতে রানটাইমের সময় যতটা সম্ভব ভুল হয়।" সেখানে কোন অন্তর্নিহিত ধর্মান্তর (একটি পদোন্নতি করার বিষয়ে নিশ্চিত Int
একটি করতে Double
? ব্যবহার করুন fromIntegral
ফাংশন)। রানটাইমের সময় কেবলমাত্র একটি অবৈধ মান সংঘটিত হওয়ার জন্য ব্যবহার করা হয় Prelude.undefined
(যা সম্ভবত আপাতত উপস্থিত থাকতে হবে এবং অপসারণ করা অসম্ভব )।
এই সমস্ত কিছু মাথায় রেখে, আসুন আমনের "ভাঙা" উদাহরণটি দেখুন এবং হাসকেলে এই কোডটি পুনরায় প্রকাশ করার চেষ্টা করি। প্রথমত, ডেটা ঘোষণা (নামযুক্ত ক্ষেত্রগুলির জন্য রেকর্ড সিনট্যাক্স ব্যবহার করে):
data NotSoBroken = NotSoBroken {foo :: Foo, bar :: Bar }
( foo
এবং bar
প্রকৃত ক্ষেত্রগুলির পরিবর্তে এখানে অনামী ক্ষেত্রগুলিতে সত্যই অ্যাক্সেসর ফাংশন রয়েছে তবে আমরা এই বিশদটি উপেক্ষা করতে পারি)।
NotSoBroken
মান কন্সট্রাকটর একটি গ্রহণ ছাড়া অন্য কোনো ব্যবস্থা গ্রহণের অসমর্থ হয় Foo
এবং একটি Bar
(যা nullable নয়) এবং একটি উপার্জন NotSoBroken
তাদের বাইরে। অত্যাবশ্যক কোড রাখার বা এমনকি ম্যানুয়ালি ক্ষেত্রগুলি বরাদ্দ করার কোনও জায়গা নেই। সমস্ত সূচনা যুক্তি অবশ্যই অন্য কোথাও সংঘটিত হওয়া উচিত, সম্ভবত কোনও ডেডিকেটেড কারখানার কার্যক্রমে।
উদাহরণস্বরূপ, Broken
সর্বদা নির্মাণ ব্যর্থ হয়। NotSoBroken
অনুরূপ ফ্যাশনে মান কন্সট্রাক্টরকে ভাঙার কোনও উপায় নেই (কোডটি লেখার পক্ষে কোথাও কোথাও নেই), তবে আমরা একটি কারখানা ফাংশন তৈরি করতে পারি যা একইভাবে ত্রুটিযুক্ত।
makeNotSoBroken :: Foo -> Bar -> Maybe NotSoBroken
makeNotSoBroken foo bar = Nothing
(প্রথম লাইনটি একটি ধরণের স্বাক্ষর ঘোষণা: makeNotSoBroken
একটি Foo
এবং একটি Bar
আর্গুমেন্ট হিসাবে গ্রহণ করে এবং উত্পাদন করে Maybe NotSoBroken
)।
রিটার্নের ধরণটি অবশ্যই হতে হবে Maybe NotSoBroken
এবং তা নয় NotSoBroken
কারণ আমরা এটিকে মূল্যায়ন করতে বলেছিলাম, এটির জন্য Nothing
একটি মান নির্মাতা Maybe
। আমরা আলাদা কিছু লিখলে প্রকারগুলি সহজেই লাইন হয় না।
একেবারে নিরর্থক হওয়া ছাড়াও, এই ফাংশনটি তার আসল উদ্দেশ্যটিও পূরণ করে না, যেমনটি আমরা এটি ব্যবহার করার চেষ্টা করব যখন আমরা দেখতে পাব। আসুন একটি ফাংশন তৈরি করি useNotSoBroken
যা NotSoBroken
একটি আর্গুমেন্ট হিসাবে প্রত্যাশা করে :
useNotSoBroken :: NotSoBroken -> Whatever
( একটি আর্গুমেন্ট হিসাবে একটি useNotSoBroken
গ্রহণ NotSoBroken
করে এবং উত্পাদন করে Whatever
)।
এবং এটি এর মতো ব্যবহার করুন:
useNotSoBroken (makeNotSoBroken)
বেশিরভাগ ভাষায়, এই ধরণের আচরণের ফলে নাল পয়েন্টার ব্যতিক্রম হতে পারে। হাসকেলে, প্রকারগুলি মেলে না: makeNotSoBroken
একটি প্রদান করে Maybe NotSoBroken
, তবে useNotSoBroken
একটি প্রত্যাশা করে NotSoBroken
। এই ধরণেরগুলি বিনিময়যোগ্য নয় এবং কোডটি সংকলনে ব্যর্থ হয়।
এটি পেতে, আমরা মানের case
কাঠামোর উপর ভিত্তি করে শাখায় একটি বিবৃতি ব্যবহার করতে পারি Maybe
( প্যাটার্ন ম্যাচিং নামে পরিচিত একটি বৈশিষ্ট্য ব্যবহার করে ):
case makeNotSoBroken of
Nothing -> --handle situation here
(Just x) -> useNotSoBroken x
স্পষ্টতই এই স্নিপেটটি আসলে সংকলনের জন্য কিছু প্রসঙ্গের ভিতরে রাখা দরকার, তবে এটি হাস্কেল কীভাবে নালাগুলি পরিচালনা করে তার মূল বিষয়গুলি প্রদর্শন করে। উপরের কোডটির একটি ধাপে ধাপে ব্যাখ্যা:
- প্রথমত,
makeNotSoBroken
মূল্যায়ন করা হয়, যা ধরণের মান উত্পন্ন করার গ্যারান্টিযুক্ত Maybe NotSoBroken
।
case
বিবৃতি এই মান কাঠামো inspects।
- মানটি
Nothing
হলে, "হ্যান্ডেল পরিস্থিতি এখানে" কোডটি মূল্যায়ন করা হয়।
- পরিবর্তে মানটি যদি কোনও মানের সাথে মেলে
Just
, তবে অন্য শাখাটি কার্যকর করা হবে। নোট করুন কীভাবে এক সাথে মিলনের ধারাটি Just
নির্মাণ হিসাবে মানটিকে শনাক্ত করে এবং এর অভ্যন্তরীণ NotSoBroken
ক্ষেত্রটিকে একটি নামের সাথে আবদ্ধ করে (এই ক্ষেত্রে, x
)। x
এরপরে ব্যবহার করা যেতে পারে যা সাধারণ NotSoBroken
মানের।
সুতরাং, প্যাটার্ন মিলটি প্রকারের সুরক্ষা প্রয়োগের জন্য একটি শক্তিশালী সুবিধা সরবরাহ করে, যেহেতু বস্তুর কাঠামো অবিচ্ছেদ্যভাবে নিয়ন্ত্রণের শাখায় আবদ্ধ থাকে।
আমি আশা করি এটি একটি বোধগম্য ব্যাখ্যা ছিল। যদি এটি অর্থবোধ করে না, তবে শিখুন ইউ হ্যাস্কেল ফর গ্রেট গুড! , আমি কখনও পড়েছি এমন সেরা অনলাইন ভাষার টিউটোরিয়ালগুলির মধ্যে একটি। আশা করি আপনি এই ভাষায় একই সৌন্দর্য দেখতে পাবেন।