উচ্চতর র্যাঙ্কের বহুমুখীতা অত্যন্ত কার্যকর। সিস্টেম এফ (টাইপ করা এফপি ভাষার মূল ভাষা যার সাথে আপনি পরিচিত), এটি "টাইপড চার্চ এনকোডিংস" স্বীকার করার জন্য প্রয়োজনীয় যা আসলে সিস্টেম এফ প্রোগ্রামিং কিভাবে করে। এগুলি ব্যতীত সিস্টেম এফ সম্পূর্ণ অকেজো।
সিস্টেম এফ এ, আমরা সংখ্যার হিসাবে সংজ্ঞা দিই
Nat = forall c. (c -> c) -> c -> c
সংযোজন টাইপ আছে
plus : Nat -> Nat -> Nat
plus l r = Λ t. λ (s : t -> t). λ (z : t). l s (r s z)
যা উচ্চতর র্যাঙ্কের ধরণ ( forall c.
সেই তীরগুলির মধ্যে প্রদর্শিত হবে)।
এটি অন্যান্য জায়গায়ও আসে। উদাহরণস্বরূপ, আপনি যদি ইঙ্গিত দিতে চান যে একটি গণনা একটি যথাযথ ধারাবাহিকতা পাস করার শৈলী (গুগল "কোডেন্সিটি হেস্কেল") তবে আপনি এটি ঠিক হিসাবে চাইবেন
type CPSed A = forall c. (A -> c) -> c
এমনকি সিস্টেম এফ-এ একটি জনহীন প্রকারের কথা বলার জন্য উচ্চতর র্যাঙ্কের বহুবচন প্রয়োজন
type Void = forall a. a
এর দীর্ঘ এবং সংক্ষিপ্ত, খাঁটি টাইপ সিস্টেমে একটি ফাংশন লেখার জন্য (সিস্টেম এফ, কোসি) যদি আমরা কোনও আকর্ষণীয় ডেটা নিয়ে কাজ করতে চাই তবে উচ্চতর র্যাঙ্ক পলিমারফিজম প্রয়োজন।
বিশেষত সিস্টেম এফ এ, এই এনকোডিংগুলি "অবিশ্বাস্য" হতে হবে। এর অর্থ একটি forall a.
পরিমাণকে শেষ করা প্রকারের সমস্ত ধরণের । এটি সমালোচনামূলকভাবে আমরা যে ধরণের সংজ্ঞা দিচ্ছি তা অন্তর্ভুক্ত করে। ইন forall a. a
যে a
আসলে জন্য দাঁড়ানো পারে forall a. a
আবার! এমএল-র মতো ভাষাগুলিতে এটি ঘটনাটি নয়, এগুলি বলা হয় যে তারা "ভবিষ্যদ্বাণীমূলক" যেহেতু একটি টাইপ ভেরিয়েবল কেবলমাত্র কোয়ানটিফায়ার ছাড়াই (একরূপ বলা হয়) প্রকারের সেটগুলিতে পরিমাণ নির্ধারণ করে । আমাদের সংজ্ঞা plus
প্রয়োজনীয় impredicativity পাশাপাশি কারণ আমরা instantiated c
মধ্যে l : Nat
হতে Nat
!
অবশেষে, আমি একটি শেষ কারণ উল্লেখ করতে চাই যেখানে আপনি অযৌক্তিকভাবে পুনরাবৃত্তিযোগ্য ধরণের (সিস্টেম এফ এর বিপরীতে) এমন একটি ভাষায় এমনকি অবিশ্বাস্যতা এবং উচ্চতর র্যাঙ্ক বহুত্ববাদ উভয়ই পছন্দ করতে চান। হাস্কেল-এ, "স্টেট থ্রেড মোনাড" নামে পরিচিত একটি ম্যানড রয়েছে। ধারণাটি হ'ল রাজ্যের থ্রেড মোনাড আপনাকে জিনিসগুলিকে পরিবর্তিত করতে দেয় তবে এড়াতে হবে যে আপনার ফল পরিবর্তনীয় কোনও কিছুর উপর নির্ভর করবে না। এর অর্থ হল যে এসটি গণনাগুলি পর্যবেক্ষণযোগ্য খাঁটি। এই প্রয়োজনীয়তাটি প্রয়োগ করতে আমরা উচ্চতর র্যাঙ্ক পলিমারফিজম ব্যবহার করি
runST :: forall a. (forall s. ST s a) -> a
এখানে যে a
বিষয়টি আমরা পরিচয় করিয়ে দিচ্ছি তার বাইরে এটি সীমাবদ্ধ তা নিশ্চিত করে s
, আমরা জানি যে a
একটি নির্ভরযোগ্য প্রকার যা নির্ভর করে না s
। আমরা s
সেই নির্দিষ্ট রাষ্ট্রের থ্রেডে সমস্ত পরিবর্তনীয় জিনিসকে প্যারামাইট্রাইজ করতে ব্যবহার করি যাতে আমরা জানতে পারি যে a
পরিবর্তনীয় বিষয়গুলির থেকে পৃথক এবং এইভাবে যে কোনও কিছুই সেই ST
গণনার সুযোগ থেকে বাঁচতে পারে ! দূর্গঠিত প্রোগ্রামগুলি বাতিল করতে প্রকারগুলি ব্যবহারের একটি দুর্দান্ত উদাহরণ।
যাইহোক, আপনি টাইপ থিওরি সম্পর্কে জানতে আগ্রহী হলে আমি ভাল বই বা দুটিতে বিনিয়োগের পরামর্শ দেব। বিটস এবং টুকরো টুকরো করে এই জিনিসগুলি শেখা খুব কঠিন। আমি পিআরসি বা হার্পারের একটি পিএল থিওরি সম্পর্কে সাধারণভাবে (এবং টাইপের তত্ত্বের কিছু উপাদান) বইয়ের পরামর্শ দেব। "প্রকার এবং প্রোগ্রামিং ভাষাগুলিতে উন্নত বিষয়গুলি" বইটিও বেশ ভাল পরিমাণের তত্ত্বকে কভার করে covers অবশেষে "মার্টিন লোফের টাইপ থিয়োরিয়ায় প্রোগ্রামিং" ইনটেনশনাল টাইপ থিওরি মার্টিন লোফের রূপরেখার একটি খুব ভাল প্রদর্শন।
let sdff = (g : (f : <T> (e : T) => void) => void) => {}