প্রথম শ্রেণির নাগরিক হিসাবে প্রকার


10

একটি সি ++ পটভূমি থেকে আসা আমি বুঝতে পারি না কেন প্রথম শ্রেণির নাগরিক হিসাবে একজনের ধরণের / ধরণের অভিব্যক্তি প্রয়োজন? আমি কেবল জানি যে ভাষাটি এই বৈশিষ্ট্যটিকে সমর্থন করে সেটি হ'ল অল্ডর।

প্রথম শ্রেণির নাগরিক হিসাবে প্রকার সম্পর্কে কারওর কিছু সাহিত্য আছে বা এর কার্যকর কারণ সম্পর্কে কিছু জানেন?



1
আপনি কি "টাইপ হ'ল একটি মান" (বিভিন্ন ভাষায় "প্রতিবিম্ব" বা "মেটাক্লাস" নামে পরিচিত) বা টাইপ এক্সপ্রেশনগুলির আরও নির্দিষ্ট ধারণা সম্পর্কে জিজ্ঞাসা করছেন?
সোভিক

1
@ স্পিক আমি পরবর্তীকালে আগ্রহী। দুর্ভাগ্যক্রমে আমি টাইপ এক্সপ্রেশন সম্পর্কে খুব বেশি সাধারণ জিনিস খুঁজে পাইনি তাই আপনি যদি কিছু সাহিত্যের পরামর্শ দিতে পারেন তবে এটি ভাল।
পল 9৮

উত্তর:


11

প্রথম শ্রেণীর প্রকারগুলি নির্ভরশীল টাইপিং নামক কিছুটিকে সক্ষম করে । এগুলি প্রোগ্রামারকে ধরণের স্তরের ধরণের মানগুলি ব্যবহার করতে দেয়। উদাহরণস্বরূপ, সমস্ত জোড় সংখ্যার টাইপ একটি নিয়মিত টাইপ, যখন ডান সংখ্যার চেয়ে ছোট বাম সংখ্যার সাথে সমস্ত পূর্ণসংখ্যার জোড় নির্ভরশীল প্রকার। এর স্ট্যান্ডার্ড সূচক উদাহরণ হ'ল দৈর্ঘ্য এনকোডড তালিকাগুলি (সাধারণত 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

এটি একটি অযৌক্তিক উদাহরণ, তবে এটি এমন কিছু প্রদর্শন করে যা আপনি প্রথম শ্রেণীর প্রকারগুলি ব্যতীত অনুকরণ করতে পারবেন না।

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