প্রথমে একটি পরিভাষা ব্যাখ্যা: negativeণাত্মক এবং ধনাত্মক অবস্থানগুলি যুক্তি থেকে আসে। এগুলি যৌক্তিক সংযোজকগুলির একটি অনুমানের বিষয়ে: এ A বি থেকে আলাদা আচরণ করে । বিভাগ তত্ত্বে অনুরূপ একটি ঘটনা ঘটে, যেখানে আমরা যথাক্রমে নেতিবাচক এবং ধনাত্মক পরিবর্তে বিপরীতমুখী এবং কোভারিয়েন্ট বলি । পদার্থবিজ্ঞানে তারা এমন পরিমাণের কথা বলে যা "সমবায়" এবং "বিপরীতেও আচরণ করে। সুতরাং এটি খুব সাধারণ ঘটনা A কোনও প্রোগ্রামার তাদের" ইনপুট "এবং" আউটপুট "হিসাবে ভাবতে পারে।এ ⇒ বিএকজনবি
এখন সূচক ডেটাটাইপগুলিতে।
একটি প্রস্তাবনামূলক ডাটাটাইপ চিন্তা বীজগাণিতিক গঠন এক ধরনের হিসাবে: কনস্ট্রাকটর যা অপারেশন উপাদান নেওয়া হয় টি আর্গুমেন্ট হিসাবে এবং নতুন উপাদান উত্পাদন টি । এটি সাধারণ বীজগণিতের সাথে খুব অনুরূপ: সংযোজন দুটি সংখ্যা নেয় এবং একটি সংখ্যা উত্পাদন করে।টিটিটি
বীজগণিতের ক্ষেত্রে এটি প্রথাগত যে একটি অপারেশন একটি সীমাবদ্ধ সংখ্যক যুক্তি গ্রহণ করে এবং বেশিরভাগ ক্ষেত্রে এটি শূন্য (ধ্রুবক), এক (অবিচ্ছিন্ন) বা দুটি (বাইনারি) যুক্তি নেয়। ডেটাটাইপগুলির নির্মাণকারীদের জন্য এটি সাধারণকরণ করা সুবিধাজনক। ধরুন c
, ডেটাটাইপের জন্য একজন নির্মাতা T
:
- যদি
c
কোনও ধ্রুবক হয় তবে আমরা এটিকে একটি ফাংশন unit -> T
বা সমতুল্য হিসাবে ভাবতে পারি (empty -> T) -> T
,
- যদি
c
অবিচ্ছিন্ন থাকে তবে আমরা এটিকে একটি ফাংশন T -> T
বা সমতুল্য হিসাবে ভাবতে পারি (unit -> T) -> T
,
- যদি
c
হয় বাইনারি আমরা একটি ফাংশন হিসাবে এটা মনে করতে পারেন T -> T -> T
, অথবা equivalently T * T -> T
, অথবা equivalently (bool -> T) -> T
,
- যদি আমরা এমন একটি কনস্ট্রাক্টর চাইতাম
c
যেটি সাতটি আর্গুমেন্ট গ্রহণ করে, তবে আমরা এটিকে এমন একটি ফাংশন হিসাবে দেখতে পেতাম (seven -> T) -> T
যেখানে seven
সাতটি উপাদানের সাথে পূর্বনির্ধারিত টাইপ রয়েছে।
- আমাদের কাছে এমন একটি কনস্ট্রাক্টরও থাকতে পারে
c
যা প্রচুর পরিমাণে তর্কগুলি গ্রহণ করে, এটি একটি ফাংশন (nat -> T) -> T
।
এই উদাহরণগুলি দেখায় যে কোনও কনস্ট্রাক্টরের সাধারণ ফর্মটি হওয়া উচিত
c : (A -> T) -> T
যেখানে আমরা কল arity এর এবং আমরা মনে একটি কন্সট্রাকটর যে লাগে ধরনের -many আর্গুমেন্ট এর একটি উপাদান উত্পাদন করতে ।A
c
c
A
T
T
Arities সংজ্ঞায়িত করা আবশ্যক: এখানে খুবই গুরুত্বপূর্ণ কিছু আগে আমরা সংজ্ঞায়িত T
বা অন্যথায় আমরা বলতে পারবো না কি কনস্ট্রাকটর কাজ করা অনুমিত হয়। কেউ যদি কনস্ট্রাক্টর রাখার চেষ্টা করে
broken: (T -> T) -> T
তাহলে প্রশ্ন "কত যুক্তি লাগে broken
?" কোন ভাল উত্তর আছে। আপনি "এটি গ্রহণ করে-অনেক T
আর্গুমেন্ট" দিয়ে উত্তর দেওয়ার চেষ্টা করতে পারেন , তবে তা করবে না, কারণ T
এটি এখনও সংজ্ঞায়িত হয়নি। আমরা কোনও ধরণ T
এবং ইনজেকশন ফাংশন সন্ধানের জন্য অভিনব ফিক্সড পয়েন্ট থিওরিটি ব্যবহার করে কুনানড্রাম থেকে বেরিয়ে আসার চেষ্টা করতে পারি (T -> T) -> T
এবং সফল হতে পারি, তবে আমরা পথের জন্য অন্তর্ভুক্তির নীতিটিও ভেঙে দেব T
। সুতরাং, এই জাতীয় জিনিস চেষ্টা করা খুব খারাপ ধারণা।
λবনামλ ⋅ vc
B
c : B * (A -> T) -> T
প্রকৃতপক্ষে, অনেক কনস্ট্রাক্টরকে এভাবে নতুন করে লেখা যেতে পারে, তবে সবকটিই নয়, আমাদের আরও একটি পদক্ষেপ প্রয়োজন, যথা আমাদের উপর নির্ভরA
করতে দেওয়া উচিত :B
c : (∑ (x : B), A x -> T) -> T
এটি একটি ইন্ডাকটিভ টাইপের জন্য কনস্ট্রাক্টরের চূড়ান্ত রূপ। ডাব্লু-টাইপ কী তাও ঠিক তা-ও বলা যায়। ফর্মটি এত সাধারণ যে আমাদের কেবলমাত্র একটি একক নির্মাণকারী প্রয়োজন c
! সত্যই, যদি আমরা তাদের দুটি আছে
d' : (∑ (x : B'), A' x -> T) -> T
d'' : (∑ (x : B''), A'' x -> T) -> T
তারপরে আমরা এগুলিকে একটিতে সংযুক্ত করতে পারি
d : (∑ (x : B), A x -> T) -> T
কোথায়
B := B' + B''
A(inl x) := A' x
A(inr x) := A'' x
যাইহোক, যদি আমরা সাধারণ ফর্মটি কারি করি তবে আমরা দেখতে পাই এটি সমান
c : ∏ (x : B), ((A x -> T) -> T)
যা প্রকৃত সহকারীগুলিতে লোকেরা আসলে লিখে রাখে তার কাছাকাছি। প্রুফ অ্যাসিস্ট্যান্টগুলি আমাদের সুবিধামত উপায়ে কন্সট্রাক্টরগুলিকে লেখার অনুমতি দেয় তবে সেগুলি উপরের সাধারণ ফর্মের সমান (অনুশীলন!)।
A
অবশেষে স্ট্যাকের বিস্তৃতি এবং বিস্ফোরণ ঘটায় (স্ট্যাক ভিত্তিক ভাষায়)।