আমি মনে করি যে সর্বজনীন প্রকারের সাথে অস্তিত্বের প্রকারগুলি ব্যাখ্যা করার অর্থটি বোধগম্য হয়েছে, যেহেতু দুটি ধারণাটি পরিপূরক, অর্থাৎ একটি অপরটির "বিপরীত"।
অস্তিত্বের ধরণের (যেমন একটি নির্ভুল সংজ্ঞা দেওয়া, সমস্ত সম্ভাব্য ব্যবহারের তালিকা, বিমূর্ত তথ্যের প্রকারের সাথে তাদের সম্পর্ক ইত্যাদির তালিকা ইত্যাদির) সম্পর্কে আমি প্রতিটি বিবরণের উত্তর দিতে পারি না কারণ আমি তার পক্ষে যথেষ্ট জ্ঞাত নই। এই হাস্কেলওয়িকি নিবন্ধটি অস্তিত্বের ধরণের মূল প্রভাব হিসাবে কেবলমাত্র (জাভা ব্যবহার করে) আমি তা প্রদর্শন করব :
অস্তিত্বের ধরণগুলি বিভিন্ন উদ্দেশ্যে ব্যবহৃত হতে পারে । তবে তারা যা করে তা হ'ল ডানদিকে একটি ধরণের পরিবর্তনশীল ' সাধারণত, ডানদিকে উপস্থিত যে কোনও ধরণের ভেরিয়েবল অবশ্যই বাম দিকে উপস্থিত হতে হবে […]
উদাহরণস্বরূপ সেট আপ:
নিম্নলিখিত সিউডো-কোডটি বেশ কার্যকর জাভা নয়, যদিও এটি ঠিক করার পক্ষে এটি যথেষ্ট সহজ হবে। আসলে, আমি ঠিক এই উত্তরটি করতে যাচ্ছি!
class Tree<α>
{
α value;
Tree<α> left;
Tree<α> right;
}
int height(Tree<α> t)
{
return (t != null) ? 1 + max( height(t.left), height(t.right) )
: 0;
}
আমি আপনার জন্য এটি সংক্ষেপে বানান। আমরা সংজ্ঞা দিচ্ছি ...
একটি পুনরাবৃত্ত প্রকার Tree<α>যা বাইনারি গাছের নোডকে উপস্থাপন করে। প্রতিটি নোড valueকিছু প্রকারের একটি সঞ্চয় করে α এবং একই ধরণের alচ্ছিক leftএবং rightসাবট্রির উল্লেখ রয়েছে ।
কোনও ফাংশন heightযা কোনও লিফ নোড থেকে মূল নোডের সর্বাধিক দূরত্বে ফিরে আসে t।
এখন, আসুন উপরের সিউডো কোডটি heightযথাযথ জাভা সিনট্যাক্সে পরিণত করুন! (আমি ব্রেইভিটির জন্য কিছু বয়লারপ্লেট বাদ দিতে থাকি, যেমন অবজেক্ট-ওরিয়েন্টেশন এবং অ্যাক্সেসিবিলিটি মডিফায়ারগুলি)) আমি দুটি সম্ভাব্য সমাধান দেখাব।
1. ইউনিভার্সাল ধরণের সমাধান:
সবচেয়ে বড় ফিক্স কেবল করা হয় heightটাইপ প্যারামিটার প্রবর্তনের দ্বারা জেনেরিক α তার স্বাক্ষর মধ্যে:
<α> int height(Tree<α> t)
{
return (t != null) ? 1 + max( height(t.left), height(t.right) )
: 0;
}
এটি আপনাকে ভেরিয়েবলগুলি ঘোষণা করতে এবং প্রকারের ভিতরে α ফাংশনের ভিতরে ভাবটি তৈরি করতে দেয়, যদি আপনি চান। কিন্তু ...
2. অস্তিত্বের ধরণের সমাধান:
আপনি যদি আমাদের পদ্ধতি লাশ তাকান, তাহলে আপনি আসলে আমরা অ্যাক্সেস করছি না, অথবা, টাইপ কিছু কাজ লক্ষ্য করবেন α ! সেই ধরণের কোনও এক্সপ্রেশন নেই বা সেই ধরণের সাথে কোনও ভেরিয়েবল ঘোষিত হয়নি ... সুতরাং, কেন আমাদের heightআদৌ জেনারিক করতে হবে? কেন আমরা কেবল সম্পর্কে ভুলবেন না পারেন α ? এটি সক্রিয় হিসাবে, আমরা এটি করতে পারি:
int height(Tree<?> t)
{
return (t != null) ? 1 + max( height(t.left), height(t.right) )
: 0;
}
আমি এই উত্তরের প্রথমদিকে যেমন লিখেছি, অস্তিত্বমূলক এবং সর্বজনীন প্রকারগুলি প্রকৃতির পরিপূরক / দ্বৈত। সুতরাং, যদি সার্বজনীন টাইপ সমাধান করতে যাচ্ছিলেন height আরো জেনেরিক, তাহলে আমরা আশা করতে পারে যে অস্তিত্ববাদের ধরনের উল্টো প্রভাব আছে: এটি তৈরি কম / জেনেরিক, যথা গোপন করে টাইপ প্যারামিটার অপসারণ α ।
ফলস্বরূপ, আপনি আর t.valueএই পদ্ধতির প্রকারটি উল্লেখ করতে পারবেন না বা এই ধরণের কোনও অভিব্যক্তি চালিত করতে পারবেন না কারণ কোনও সনাক্তকারী এটির সাথে আবদ্ধ হয়নি। ( ?ওয়াইল্ডকার্ড একটি বিশেষ টোকেন, কোনও শনাক্তকারী নয় যা কোনও ধরণের "ক্যাপচার" করে)) t.valueকার্যকরভাবে অস্বচ্ছ হয়ে উঠেছে; সম্ভবত আপনি কেবল এটির সাথে এখনও এটি করতে পারেন এটি এটিকে টাইপ-কাস্ট করা Object।
সারসংক্ষেপ:
===========================================================
| universally existentially
| quantified type quantified type
---------------------+-------------------------------------
calling method |
needs to know | yes no
the type argument |
---------------------+-------------------------------------
called method |
can use / refer to | yes no
the type argument |
=====================+=====================================