নির্ভরশীল টাইপ করা হাস্কেল, এখন?
হাস্কেল হ'ল কিছুটা হলেও নির্ভরশীলভাবে টাইপ করা একটি ভাষা। টাইপ-লেভেল ডেটার ধারণা রয়েছে, এখন আরও সংবেদনশীলভাবে ধন্যবাদ টাইপ করা হয়েছে DataKinds
, এবং GADTs
টাইপ-লেভেল ডেটাগুলিতে রান-টাইম প্রতিনিধিত্ব করার কিছু উপায় রয়েছে ( )। সুতরাং, রান-টাইম স্টাফের মানগুলি কার্যকরভাবে প্রকারভেদে প্রদর্শিত হয় , যা কোনও ভাষার জন্য নির্ভর করে টাইপ করা মানে।
সাধারণ ডেটাটাইপগুলি ধরণের স্তরে উন্নীত হয়, যাতে তাদের থাকা মানগুলি ধরণের ক্ষেত্রে ব্যবহার করা যায়। সুতরাং প্রত্নতাত্ত্বিক উদাহরণ
data Nat = Z | S Nat
data Vec :: Nat -> * -> * where
VNil :: Vec Z x
VCons :: x -> Vec n x -> Vec (S n) x
সম্ভব হয়ে ওঠে এবং এর সাথে সংজ্ঞা যেমন
vApply :: Vec n (s -> t) -> Vec n s -> Vec n t
vApply VNil VNil = VNil
vApply (VCons f fs) (VCons s ss) = VCons (f s) (vApply fs ss)
যা সুন্দর. নোট করুন যে দৈর্ঘ্যটি n
সেই ফাংশনে একটি খাঁটি স্থিতিশীল জিনিস, এটি নিশ্চিত করে যে ইনপুট এবং আউটপুট ভেক্টরগুলির একই দৈর্ঘ্য রয়েছে, যদিও সেই দৈর্ঘ্য কার্যকর করার ক্ষেত্রে কোনও ভূমিকা পালন করে না
vApply
। বিপরীতে এটা অনেক, trickier (অর্থাত, অসম্ভব) ফাংশন যার ফলে বাস্তবায়ন করার n
একটি প্রদত্ত কপি x
(হবে যা pure
করার vApply
s 'এর <*>
)
vReplicate :: x -> Vec n x
কারণ রান-টাইমে কয়টি অনুলিপি করা জেনে রাখা গুরুত্বপূর্ণ। সিলেটলেট প্রবেশ করান।
data Natty :: Nat -> * where
Zy :: Natty Z
Sy :: Natty n -> Natty (S n)
যে কোনও প্রচারযোগ্য প্রকারের জন্য, আমরা সিঙ্গেলটন পরিবার তৈরি করতে পারি, প্রচারিত ধরণের উপরে সূচিযুক্ত, এর মানগুলির রান-টাইম ডুপ্লিকেট দ্বারা বাস করা। Natty n
টাইপ-লেভেলের রান-টাইম কপিগুলির ধরণ n
:: Nat
। আমরা এখন লিখতে পারি
vReplicate :: Natty n -> x -> Vec n x
vReplicate Zy x = VNil
vReplicate (Sy n) x = VCons x (vReplicate n x)
সুতরাং সেখানে আপনার একটি টাইপ-স্তরের মানটি রান-টাইম মানটির সাথে যুক্ত হয়েছে: রান-টাইম অনুলিপিটি পরীক্ষা করে দেখা টাইপ-স্তরের মানের স্থিতিক জ্ঞানকে পরিমার্জন করে। শর্তাবলী এবং প্রকারগুলি পৃথক করা সত্ত্বেও, আমরা সিঙ্গেলটন নির্মাণকে এক ধরণের ইপোক্সি রজন হিসাবে ব্যবহার করে পর্যায়ক্রমে বন্ধন তৈরি করে নির্ভর করে টাইপড পদ্ধতিতে কাজ করতে পারি। ধরণের রান-টাইম এক্সপ্রেশনগুলিকে বিভিন্ন ধরণের অনুমতি দেওয়া থেকে এটি দীর্ঘ পথ, তবে এটি কিছুই নয়।
কি বাজে? কি অনুপস্থিত?
আসুন এই প্রযুক্তিটির উপরে কিছুটা চাপ দিন এবং দেখুন কী ঘোরাফেরা শুরু হয়। আমরা এই ধারণাটি পেতে পারি যে সিলেটলেটগুলি আরও কিছুটা স্পষ্টভাবে পরিচালনাযোগ্য হওয়া উচিত
class Nattily (n :: Nat) where
natty :: Natty n
instance Nattily Z where
natty = Zy
instance Nattily n => Nattily (S n) where
natty = Sy natty
আমাদের লিখতে দেয়, বলে,
instance Nattily n => Applicative (Vec n) where
pure = vReplicate natty
(<*>) = vApply
এটি কাজ করে, তবে এর অর্থ এখন আমাদের আসল Nat
প্রকারের তিনটি অনুলিপি তৈরি হয়েছে: এক ধরণের, একক পরিবার এবং একটি সিঙ্গলটন শ্রেণি। সুস্পষ্ট Natty n
মান এবং Nattily n
অভিধানের আদান-প্রদানের জন্য আমাদের কাছে একটি বিস্তৃত প্রক্রিয়া রয়েছে । তদুপরি, Natty
এটি নয় Nat
: রান-টাইম মানগুলির উপর আমাদের একরকম নির্ভরতা রয়েছে, তবে আমরা প্রথমে যে ধরণের ভেবেছিলাম তা নয়। পুরোপুরি নির্ভরশীলভাবে টাইপ করা কোনও ভাষা নির্ভরশীল টাইপগুলিকে এই জটিল করে তোলে না!
এদিকে Nat
পদোন্নতি দেওয়া হলেও করা Vec
যায় না। আপনি কোনও সূচিকৃত প্রকার অনুসারে সূচী করতে পারবেন না। নির্ভরশীল টাইপ করা ভাষাগুলিতে সম্পূর্ণ এ জাতীয় কোনও বিধিনিষেধ আরোপ করে না, এবং নির্ভরশীল টাইপযুক্ত শো-অফ হিসাবে আমার কেরিয়ারে আমি আমার আলোচনায় দ্বি-স্তর সূচকের উদাহরণ অন্তর্ভুক্ত করতে শিখেছি, কেবলমাত্র একটি স্তরকে সূচি তৈরিকারী লোকদের শেখাতে কঠিন-তবে-সম্ভাবনা আমাকে কার্ডের ঘরের মতো ভাঁজ করার আশা করবেন না। সমস্যা কি? সমতা। জিএডিডিগুলি যখন আপনি কোনও নির্মাতাকে একটি নির্দিষ্ট রিটার্নাল টাইপকে সুস্পষ্ট সমীকরণীয় দাবীতে রূপান্তর করেন তখন আপনি স্পষ্টভাবে অর্জন করেন এমন বাধাগুলি অনুবাদ করে কাজ করে। এটার মত.
data Vec (n :: Nat) (x :: *)
= n ~ Z => VNil
| forall m. n ~ S m => VCons x (Vec m x)
আমাদের দুটি সমীকরণের প্রতিটি ক্ষেত্রে উভয় পক্ষের সদয় থাকে Nat
।
এখন ভেক্টরগুলির উপর সূচকযুক্ত কোনও কিছুর জন্য একই অনুবাদ চেষ্টা করুন।
data InVec :: x -> Vec n x -> * where
Here :: InVec z (VCons z zs)
After :: InVec z ys -> InVec z (VCons y ys)
হয়ে
data InVec (a :: x) (as :: Vec n x)
= forall m z (zs :: Vec x m). (n ~ S m, as ~ VCons z zs) => Here
| forall m y z (ys :: Vec x m). (n ~ S m, as ~ VCons y ys) => After (InVec z ys)
এবং এখন আমরা মধ্যে equational সীমাবদ্ধতার গঠন as :: Vec n x
এবং
VCons z zs :: Vec (S m) x
যেখানে দুই পক্ষের চিহ্নগুলি সিন্টেক্সের স্বতন্ত্র (কিন্তু provably সমান) ধরণের আছে। জিএইচসি কোর বর্তমানে এই জাতীয় ধারণার জন্য সজ্জিত নয়!
আর কি অনুপস্থিত? ঠিক আছে, বেশিরভাগ হাস্কেল টাইপ স্তরটি থেকে অনুপস্থিত। আপনি যে পদগুলির প্রচার করতে পারেন তার ভাষাতে কেবল ভেরিয়েবল এবং নন-জিএডিডি কনস্ট্রাক্টর রয়েছে। একবার আপনার কাছে type family
এলে , যন্ত্রপাতি আপনাকে টাইপ-লেভেল প্রোগ্রামগুলি লেখার অনুমতি দেয়: এগুলির মধ্যে কয়েকটি পুরোপুরি ফাংশনের মতো হতে পারে যা আপনি শব্দ পর্যায়ে লেখাকে বিবেচনা করবেন (উদাহরণস্বরূপ, Nat
সংযোজন সহ সজ্জিত , যাতে আপনি সংযোজন করার জন্য একটি ভাল টাইপ দিতে পারেন Vec
) তবে এটি কেবল কাকতালীয় ঘটনা!
অনুপস্থিতিতে আর একটি জিনিস অনুপস্থিত, হ'ল একটি লাইব্রেরি যা মূল্যবোধ অনুসারে সূচি প্রকারের জন্য আমাদের নতুন ক্ষমতা ব্যবহার করে। এই সাহসী নতুন বিশ্বে কী Functor
এবং Monad
হয়ে ওঠে? আমি এটি সম্পর্কে চিন্তা করছি, কিন্তু এখনও অনেক কিছু করার আছে।
টাইপ-লেভেল প্রোগ্রাম চলমান
বেশিরভাগ নির্ভরশীল টাইপড প্রোগ্রামিং ভাষার মতো হাস্কেলেরও দুটি
অপারেশনাল সিমেন্টিস রয়েছে। রান-টাইম সিস্টেমটি প্রোগ্রাম চালানোর উপায় রয়েছে (কেবলমাত্র বন্ধ হওয়া এক্সপ্রেশনগুলি, টাইপ মুছে ফেলার পরে, অত্যন্ত অনুকূলিতকরণ করা) এবং তারপরে টাইপচেকার প্রোগ্রামগুলি চালনার উপায় রয়েছে (আপনার টাইপ পরিবারগুলি, আপনার "টাইপ শ্রেণীর প্রোলোগ", মুক্ত অভিব্যক্তি সহ)। হাস্কেলের জন্য, আপনি সাধারণত দুটি মেশান না, কারণ সম্পাদিত প্রোগ্রামগুলি বিভিন্ন ভাষায়। নির্ভরযোগ্যভাবে টাইপ করা ভাষাগুলিতে একই ভাষার প্রোগ্রামগুলির জন্য পৃথক রান-টাইম এবং স্ট্যাটিক এক্সিকিউশন মডেল রয়েছে, তবে চিন্তা করবেন না, রান-টাইম মডেলটি আপনাকে এখনও ক্ষয় টাইপ করতে দেয় এবং প্রকৃতপক্ষে প্রমাণ মুছে ফেলা: এটিই কোকের এক্সট্রাকশন whatপ্রক্রিয়া আপনাকে দেয়; এটি অ্যাডউন ব্র্যাডি-র সংকলকটি অন্তত যা করেন তা (যদিও এডউইন অকারণে নকল মান, পাশাপাশি প্রকার এবং প্রমাণাদি মুছে ফেলে)। পর্যায়ের পার্থক্যটি
আর কোনও সিনট্যাক্টিক বিভাগের পার্থক্য নাও হতে পারে তবে এটি জীবিত এবং ভাল।
নির্ভরযোগ্যভাবে টাইপ করা ভাষা, মোট, টাইপচেকারকে দীর্ঘ প্রতীক্ষার চেয়ে খারাপ কিছু না হওয়ার আশঙ্কায় প্রোগ্রামগুলি চালনার অনুমতি দেয়। হাস্কেল আরও নির্ভরশীলভাবে টাইপ হওয়ার সাথে সাথে আমরা তার স্ট্যাটিক এক্সিকিউশন মডেলটি কী হওয়া উচিত এই প্রশ্নের মুখোমুখি হই? একটি পদ্ধতি হ'ল স্থির সম্পাদন মোট ফাংশনগুলিতে সীমাবদ্ধ করা, যা আমাদের একই স্বাধীনতা চালানোর অনুমতি দেয়, তবে আমাদের ডাটা এবং কোডাটার মধ্যে পার্থক্য (কমপক্ষে টাইপ-লেভেল কোডের জন্য) তৈরি করতে বাধ্য করতে পারে, যাতে আমরা বলতে পারি যে কিনা সমাপ্তি বা উত্পাদনশীলতা প্রয়োগ করুন। তবে এটাই একমাত্র পন্থা নয়। আমরা অনেক দুর্বল কার্যকর সম্পাদন মডেল বাছাই করতে পারছি যা প্রোগ্রামগুলি চালাতে অনিচ্ছুক, কম সমীকরণ তৈরি করার ব্যয়ে কেবল গণনা দ্বারা প্রকাশিত হবে। এবং বাস্তবে, জিএইচসি আসলে এটিই করে। জিএইচসি কোরের জন্য টাইপিং বিধিগুলি চলমান সম্পর্কে কোনও উল্লেখ করে না
প্রোগ্রাম, কিন্তু শুধুমাত্র সমীকরণের জন্য প্রমাণ পরীক্ষা করার জন্য। মূলটিতে অনুবাদ করার সময়, জিএইচসি-র সীমাবদ্ধ সমাধানকারী আপনার টাইপ-লেভেল প্রোগ্রামগুলি চালানোর চেষ্টা করে, প্রমাণের একটি সামান্য রৌপ্য ট্রেইল তৈরি করে যে প্রদত্ত প্রকাশটি তার স্বাভাবিক ফর্মের সমান। প্রমাণ-প্রজন্মের এই পদ্ধতিটি কিছুটা অপ্রত্যাশিত এবং অনিবার্যভাবে অসম্পূর্ণ: উদাহরণস্বরূপ, এটি ভীতিকর চেহারার পুনরাবৃত্তিগুলির সাথে লজ্জিত হয় এবং সম্ভবত এটি বুদ্ধিমান। IO
যে বিষয়টির জন্য আমাদের উদ্বিগ্ন হওয়ার দরকার নেই তা হ'ল টাইপচেকারের গণনা সম্পাদন : মনে রাখবেন যে launchMissiles
রান-টাইম সিস্টেমের মতো টাইপচেকারকে একই অর্থ দিতে
হবে না!
হিন্দি-মিলনার সংস্কৃতি
দুর্ভাগ্যজনক সাংস্কৃতিক পার্শ্ব-প্রতিক্রিয়া সহ হিন্ডলি-মিলনার টাইপ সিস্টেমটি চারটি স্বতন্ত্র পার্থক্যের সত্যই বিস্ময়কর কাকতালীয়তা অর্জন করে যে অনেক লোক এই পার্থক্যের মধ্যে পার্থক্য দেখতে পায় না এবং এটি কাকতালীয় ঘটনাটি অনিবার্য বলে ধরে নিতে পারে! আমি কি সম্পর্কে কথা বলছি?
- পদ বনাম প্রকার
- স্পষ্টত লিখিত জিনিস বনাম স্পষ্টত লিখিত জিনিস
- রান- টাইমের আগে রান-টাইম বনাম মুছে ফেলা উপস্থিতি
- নির্ভরশীল বিমূর্তকরণ বনাম নির্ভরশীল বিমূর্ততা
আমরা শর্তাবলী লিখতে অভ্যস্ত এবং অনুমান করা প্রকারের প্রস্থান ... এবং তারপরে মুছে ফেলা। আমরা অনুরূপ প্রকার বিমূর্ততা এবং অ্যাপ্লিকেশনটি নিঃশব্দে এবং স্থিতিশীলভাবে সংঘটিত হওয়ার সাথে প্রকারের ভেরিয়েবলগুলির পরিমাণ নির্ধারণ করতে অভ্যস্ত।
এই পার্থক্যগুলি প্রান্তিককরণ থেকে বেরিয়ে আসার আগে আপনাকে ভ্যানিলা হিন্ডলি-মিলনার থেকে খুব বেশি দূরে যেতে হবে না এবং এটি কোনও খারাপ জিনিস নয় । শুরু করার জন্য, আমরা কয়েকটি জায়গায় লিখতে ইচ্ছুক হলে আমাদের আরও আকর্ষণীয় প্রকার থাকতে পারে। এদিকে, ওভারলোডেড ফাংশনগুলি ব্যবহার করার সময় আমাদের টাইপ ক্লাসের অভিধান লিখতে হবে না, তবে সেই অভিধানগুলি অবশ্যই রান-টাইমে উপস্থিত (বা ইনলাইনড) রয়েছে। নির্ভরশীলভাবে টাইপ করা ভাষায়, আমরা রান-টাইমে কেবল প্রকারের চেয়ে বেশি মুছে ফেলার প্রত্যাশা করি, তবে (প্রকারের শ্রেণিগুলির মতো) যে কিছু স্পষ্টতই অনুমানক মানগুলি মুছে ফেলা হবে না। উদাহরণস্বরূপ, vReplicate
এর সংখ্যাসূচক যুক্তিটি প্রায়শই পছন্দসই ভেক্টরের ধরণের থেকে অপ্রয়োজনীয়, তবে আমাদের রান-টাইমে এটি জানা দরকার।
আমাদের কোন ভাষার নকশার পছন্দগুলি পর্যালোচনা করা উচিত কারণ এই সংযুক্তাগুলি আর রাখে না? উদাহরণস্বরূপ, এটি কি ঠিক যে হাস্কেল forall x. t
স্পষ্টভাবে কোনও পরিমাণকে ত্বরান্বিত করার কোনও উপায় সরবরাহ করে না ? টাইপচেকার একত্রীকরণের মাধ্যমে অনুমান করতে না x
পারলে t
আমাদের কী x
হবে তা বলার আর কোনও উপায় নেই ।
আরও বিস্তৃতভাবে আমরা "টাইপ ইনফারেন্স "টিকে একরকম ধারণা হিসাবে গণ্য করতে পারি না যে আমাদের কাছে সমস্ত কিছুই বা কিছুই নেই। শুরু করার জন্য, আমাদের "জেনারালাইজেশন" দিকটি (মিলনারের "লেট" নিয়ম) কে বিভক্ত করতে হবে, যা "স্পেশালাইজেশন" দিক থেকে বোকা মেশিনটি কোনও অনুমান করতে পারে তা নিশ্চিত করার জন্য কোন ধরণের উপস্থিতি সীমাবদ্ধ করার উপর প্রচুর নির্ভর করে "বিধি) যা আপনার সীমাবদ্ধ সমাধানকারী হিসাবে কার্যকর। আমরা আশা করতে পারি যে শীর্ষ-স্তরের প্রকারগুলি নির্ধারণ করা আরও শক্ত হয়ে উঠবে, তবে সেই অভ্যন্তরীণ প্রকারের তথ্য প্রচার করা মোটামুটি সহজ থাকবে।
হাস্কেলের জন্য পরবর্তী পদক্ষেপ
আমরা প্রকার এবং ধরণের স্তরগুলির সাথে একই রকম বৃদ্ধি পেতে দেখছি (এবং তারা ইতিমধ্যে জিএইচসিতে অভ্যন্তরীণ উপস্থাপনা ভাগ করে নিয়েছে)। আমরা পাশাপাশি তাদের মার্জ করতে পারি। এটি পারলে মজাদার হবে * :: *
: আমরা অনেক আগে লজিক্যাল সাউন্ডনেস হারিয়েছিলাম
, যখন আমরা নীচে অনুমতি দিয়েছিলাম, তবে টাইপ
সাউন্ডনেস সাধারণত একটি দুর্বল প্রয়োজন। আমাদের অবশ্যই চেক করা উচিত আমাদের অবশ্যই স্বতন্ত্র প্রকার, ধরনের, ইত্যাদি স্তর থাকতে হবে, আমরা কমপক্ষে তা নিশ্চিত করতে পারি যে টাইপ স্তরের এবং উপরে সমস্ত কিছু সর্বদা প্রচার করা যায় can ধরণের স্তরে বহুবর্ষকে পুনরায় উদ্ভাবন না করে ধরণের জন্য আমাদের ইতিমধ্যে যে পলিমারফিজম রয়েছে তা পুনরায় ব্যবহার করা দুর্দান্ত হবে।
আমরা সহজতর করা এবং অনুমতি দিয়ে সীমাবদ্ধতার বর্তমান ব্যবস্থার সাধারণের উচিত ভিন্নধর্মী সমীকরণ a ~ b
যেখানে ধরণের a
এবং
b
চিহ্নগুলি সিন্টেক্সের অনুরূপ না (কিন্তু সমান প্রমাণিত করা যেতে পারে)। এটি একটি পুরানো কৌশল (আমার থিসিসে, গত শতাব্দীতে) যা নির্ভরতা মোকাবেলা করা আরও সহজ করে তোলে। আমরা জিএডিডিগুলিতে প্রকাশের ক্ষেত্রে প্রতিবন্ধকতা প্রকাশ করতে সক্ষম হব এবং এভাবে কী প্রচার করা যেতে পারে তার উপর বিধিনিষেধ শিথিল করতে পারি।
আমাদের একটি নির্ভরশীল ফাংশন প্রকার, প্রবর্তন করে সিঙ্গলটন নির্মাণের প্রয়োজনীয়তা বাদ দেওয়া উচিত pi x :: s -> t
। এ জাতীয় ধরণের একটি ফাংশন স্পষ্টভাবে প্রয়োগ করতে পারে কোনও প্রকারের মত প্রকাশের ক্ষেত্রে s
যা টাইপ এবং শব্দভাষার সংযোগস্থলে বাস করে (সুতরাং, ভেরিয়েবল, কনস্ট্রাক্টর, আরও অনেক কিছু পরে আসবে)। সংশ্লিষ্ট লাম্বদা এবং অ্যাপ্লিকেশন রান-টাইমে মুছে ফেলা হবে না, তাই আমরা লিখতে সক্ষম হব
vReplicate :: pi n :: Nat -> x -> Vec n x
vReplicate Z x = VNil
vReplicate (S n) x = VCons x (vReplicate n x)
Nat
দ্বারা প্রতিস্থাপন ছাড়া Natty
। এর ডোমেনটি pi
যে কোনও প্রচারমূলক প্রকার হতে পারে, তাই যদি জিএডিডিগুলি প্রচার করা যায় তবে আমরা নির্ভরশীল কোয়ানটিফায়ার সিকোয়েন্সগুলি লিখতে পারি (বা "ডেইলিউইজন তাদের" টেলিস্কোপস "বলেছিল)
pi n :: Nat -> pi xs :: Vec n x -> ...
আমাদের যে দৈর্ঘ্যের প্রয়োজন to
এই পদক্ষেপগুলির মূল বিষয় হ'ল দুর্বল সরঞ্জাম এবং আড়ম্বরপূর্ণ এনকোডিংগুলি না করে আরও সাধারণ সরঞ্জামগুলির সাথে সরাসরি কাজ করে জটিলতা দূর করা । বর্তমান আংশিক ক্রয়-করা হ্যাস্কেলের ধরণের নির্ভরশীল ধরণের নির্ভরযোগ্যতাগুলির প্রয়োজনের তুলনায় আরও ব্যয়বহুল করে তোলে।
খুব কঠিন?
নির্ভরশীল প্রকারগুলি প্রচুর মানুষকে উদ্বিগ্ন করে তোলে। তারা আমাকে নার্ভাস করে, তবে আমি নার্ভাস হতে পছন্দ করি বা কমপক্ষে আমি যাই হোক না কেন নার্ভাস হওয়া কঠিন বলে মনে করি। তবে এটি এই বিষয়টির আশেপাশে যথেষ্ট অজ্ঞতার কুয়াশার সাহায্য করে না। এর কয়েকটি আমাদের এখনও অনেক কিছু শিখার কারণে রয়েছে। তবে কম মৌলিক পদ্ধতির সমর্থকরা সবসময় সত্যগুলি নিশ্চিত করে তা নিশ্চিত না করে নির্ভরশীল ধরণের ভয়কে চিহ্নিত করতে পরিচিত। নাম বলব না। এই "অনির্বচনীয় টাইপচেকিং", "টিউরিং অসম্পূর্ণ", "কোন ধাপের পার্থক্য নেই", "কোনও ধরণের মুছে ফেলা হবে না", "সর্বত্র প্রমাণ", ইত্যাদি, মিথগুলি আবর্জনা সত্ত্বেও অব্যাহত রয়েছে।
নির্ভরযোগ্যভাবে টাইপ করা প্রোগ্রামগুলি অবশ্যই সর্বদা সঠিক প্রমাণিত হওয়া উচিত। যে কোনও একটি সম্পূর্ণরূপে নির্দিষ্টকরণের দিকে না গিয়ে প্রকারভেদে অতিরিক্ত আক্রমণকারীদের প্রয়োগ করে, একটির প্রোগ্রামের প্রাথমিক স্বাস্থ্যকর উন্নতি করতে পারে। এই দিকের ছোট পদক্ষেপগুলি প্রায়শই কয়েকটি বা কোনও অতিরিক্ত প্রমাণ বাধ্যবাধকতার সাথে অনেক বেশি শক্তিশালী গ্যারান্টি দেয়। এটি সত্য নয় যে নির্ভরশীলভাবে টাইপ করা প্রোগ্রামগুলি অনিবার্যভাবে প্রমাণ সহ পূর্ণ হয়, প্রকৃতপক্ষে আমি সাধারণত আমার সংজ্ঞাগুলিকে প্রশ্নবিদ্ধ করার ইঙ্গিত হিসাবে আমার কোডে কোনও প্রমাণের উপস্থিতি গ্রহণ করি ।
কারণ, যেকোন রকমের কমনীয়তার সাথে আমরা ন্যায্য পাশাপাশি নতুন কিছু নতুন কথা বলতেও নির্দ্বিধায় পড়েছি। উদাহরণস্বরূপ, বাইনারি অনুসন্ধান গাছগুলি সংজ্ঞায়িত করার জন্য প্রচুর ক্ষুধার্ত উপায় রয়েছে, তবে এর অর্থ এটি নেই যে কোনও ভাল উপায় নেই । এটি অনুমান করা গুরুত্বপূর্ণ নয় যে খারাপ অভিজ্ঞতা ভাল দেওয়া যায় না, এমনকি যদি তা স্বীকার করতে অহংকার করে। নির্ভরশীল সংজ্ঞাগুলির ডিজাইন একটি নতুন দক্ষতা যা শিখতে লাগে এবং হ্যাস্কেল প্রোগ্রামার হওয়া আপনাকে স্বয়ংক্রিয়ভাবে বিশেষজ্ঞ তৈরি করে না! এমনকি যদি কিছু প্রোগ্রাম মূর্খ হয় তবে আপনি কেন অন্যকে ন্যায্য বলে স্বাধীনতা অস্বীকার করবেন?
তবুও হাসেলকে কেন বিরক্ত করবেন?
আমি সত্যিই নির্ভরশীল ধরণের উপভোগ করি তবে আমার বেশিরভাগ হ্যাকিং প্রকল্পগুলি এখনও হাস্কেলের মধ্যে রয়েছে। কেন? হাস্কেলের টাইপ ক্লাস রয়েছে। হাস্কেলের দরকারী গ্রন্থাগার রয়েছে। হাস্কেলের এফেক্টস সহ প্রোগ্রামিংয়ের একটি কার্যক্ষম (যদিও আদর্শ থেকে অনেক বেশি) চিকিত্সা রয়েছে। হাস্কেলের একটি শিল্প শক্তি সংকলক রয়েছে। নির্ভরশীল টাইপ করা ভাষাগুলি ক্রমবর্ধমান জনগোষ্ঠী এবং অবকাঠামোতে অনেক আগের পর্যায়ে রয়েছে তবে আমরা কীভাবে সম্ভব তা বাস্তবের প্রজন্মের শিফট সহ, সেখানে উপস্থিত করব, উদাহরণস্বরূপ, রূপক ও ডেটাটাইপ জেনারিকের মাধ্যমে। তবে নির্ভরযোগ্য প্রকারের দিকে হাস্কেলের পদক্ষেপের ফলস্বরূপ লোকেরা কী করছে তা আপনার চারপাশে দেখতে হবে যে, বর্তমানের প্রজন্মের ভাষাগুলিও এগিয়ে রেখে, আরও অনেক উপকার পাওয়া যায়।