প্রথম শ্রেণীর প্রকারগুলি নির্ভরশীল টাইপিং নামক কিছুটিকে সক্ষম করে । এগুলি প্রোগ্রামারকে ধরণের স্তরের ধরণের মানগুলি ব্যবহার করতে দেয়। উদাহরণস্বরূপ, সমস্ত জোড় সংখ্যার টাইপ একটি নিয়মিত টাইপ, যখন ডান সংখ্যার চেয়ে ছোট বাম সংখ্যার সাথে সমস্ত পূর্ণসংখ্যার জোড় নির্ভরশীল প্রকার। এর স্ট্যান্ডার্ড সূচক উদাহরণ হ'ল দৈর্ঘ্য এনকোডড তালিকাগুলি (সাধারণত Vector
হাস্কেল / ইদ্রিসে ডাকা হয়)। নিম্নলিখিত সিউডো কোডটি ইদ্রিস এবং হাস্কেলের মিশ্রণ।
-- a natural number
data Nat = Zero | Successor Nat
data Vector length typ where
Empty : Vector Zero typ
(::) : typ -> Vector length typ -> Vector (Successor length) typ
এই কোডের টুকরা আমাদের দুটি জিনিস বলে:
- খালি তালিকার দৈর্ঘ্য শূন্য।
cons
একটি উপাদানের তালিকায় একটি তালিকা তৈরি করে দৈর্ঘ্যের একটি তালিকা তৈরি হয় n + 1
এটি 0 এর সাথে অন্য একটি ধারণার সাথে খুব মিল বলে মনে হচ্ছে n + 1
, তাই না? আমি আবার ফিরে আসব।
এ থেকে আমরা কী লাভ করব? আমরা এখন যে ফাংশনগুলি ব্যবহার করি তার অতিরিক্ত বৈশিষ্ট্যগুলি নির্ধারণ করতে পারি। উদাহরণস্বরূপ: এর একটি গুরুত্বপূর্ণ সম্পত্তি append
হ'ল ফলাফলের তালিকার দৈর্ঘ্য হল দুটি যুক্তি তালিকার দৈর্ঘ্যের সমষ্টি:
plus : Nat -> Nat -> Nat
plus Zero n = n
plus (Successor m) n = Successor (plus m n)
append : Vector n a -> Vector m a -> Vector (plus n m) a
append Empty ys = ys
append (x::xs) ys = x :: append xs ys
তবে এই সমস্ত কৌশলটি সমস্তই দৈনন্দিন প্রোগ্রামিংয়ে দরকারী বলে মনে হয় না। এটি কীভাবে সকেট, POST
/ GET
অনুরোধগুলির সাথে সম্পর্কিত ?
ভাল এটি না (কমপক্ষে যথেষ্ট প্রচেষ্টা ছাড়া না)। তবে এটি আমাদের অন্যান্য উপায়ে সহায়তা করতে পারে:
নির্ভরশীল প্রকারগুলি আমাদের কোডগুলিতে আক্রমণকারী তৈরি করার অনুমতি দেয় - কোনও ফাংশন কীভাবে আচরণ করা উচিত তা নিয়ম। এগুলি ব্যবহার করে আমরা কোডের আচরণ সম্পর্কে অতিরিক্ত সুরক্ষা পাই, আইফেলের প্রাক এবং পোস্টকন্ডিশনের অনুরূপ। এটি স্বয়ংক্রিয় উপপাদ্য প্রমাণের জন্য অত্যন্ত কার্যকর, যা ইদ্রিসের সম্ভাব্য ব্যবহারগুলির মধ্যে একটি।
উপরের উদাহরণটিতে ফিরে আসা, দৈর্ঘ্য-এনকোডযুক্ত তালিকার সংজ্ঞাটি আনয়ন সম্পর্কিত গাণিতিক ধারণার অনুরূপ । ইদ্রিসে, আপনি আসলে নীচে যেমন একটি তালিকার অন্তর্ভুক্তি ধারণাটি তৈরি করতে পারেন:
-- If you can supply the following:
list_induction : (Property : Vector len typ -> Type) -> -- a property to show
(Property Empty) -> -- the base case
((w : a) -> (v : Vector n a) ->
Property v -> Property (w :: v)) -> -- the inductive step
(u : Vector m b) -> -- an arbitrary vector
Property u -- the property holds for all vectors
এই কৌশলটি গঠনমূলক প্রমাণের মধ্যে সীমাবদ্ধ তবে এটি খুব শক্তিশালী। আপনি append
অনুশীলন হিসাবে inductively লিখতে চেষ্টা করতে পারেন ।
অবশ্যই, নির্ভরশীল প্রকারগুলি প্রথম শ্রেণির ধরণেরগুলির মধ্যে কেবল একটির ব্যবহার, তবে এটি যুক্তিযুক্তভাবে সর্বাধিক সাধারণ একটি। অতিরিক্ত ব্যবহারগুলির মধ্যে অন্তর্ভুক্ত রয়েছে, উদাহরণস্বরূপ, তার তর্কগুলির ভিত্তিতে একটি ফাংশন থেকে নির্দিষ্ট ধরণের প্রত্যাবর্তন।
type_func : Vector n a -> Type
type_func Empty = Nat
type_func v = Vector (Successor Zero) Nat
f : (v : Vector n a) -> type_func v
f Empty = 0
f vs = length vs :: Empty
এটি একটি অযৌক্তিক উদাহরণ, তবে এটি এমন কিছু প্রদর্শন করে যা আপনি প্রথম শ্রেণীর প্রকারগুলি ব্যতীত অনুকরণ করতে পারবেন না।