আপনার উচ্চতর ধরণের দরকার কেন?


13

কিছু কিছু ভাষায় ক্লাস এবং টাইপ পরামিতি সঙ্গে ফাংশন (যেমন জন্য অনুমতি List<T>যেখানে Tএকটি অবাধ ধরনের হতে পারে)। উদাহরণস্বরূপ, আপনার মতো ফাংশন থাকতে পারে:

List<S> Function<S, T>(List<T> list)

কিছু ভাষাগুলি এই ধারণাটিকে এক স্তর উচ্চতর করার অনুমতি দেয় যা আপনাকে স্বাক্ষর সহ কোনও ফাংশন রাখতে দেয়:

K<S> Function<K<_>, S, T>(K<T> arg)

যেখানে K<_>নিজেই এমন List<_>এক ধরণের প্যারামিটার রয়েছে। এই "আংশিক টাইপ" টাইপ কনস্ট্রাক্টর হিসাবে পরিচিত।

আমার প্রশ্ন, আপনার এই দক্ষতার দরকার কেন? এটির মতো একটি ধরণের ধারণাগুলি বোধগম্য হয় List<T>কারণ সমস্ত List<T>প্রায় একই রকম, তবে সমস্ত K<_>কিছু সম্পূর্ণ আলাদা হতে পারে। আপনি একটি থাকতে পারে Option<_>এবং List<_>সব সময়ে কোন সাধারণ কার্যকারিতা আছে।


7
বিভিন্ন ভাল উত্তর এখানে আছেন: stackoverflow.com/questions/21170493/...
itsbruce

3
@itsbruce বিশেষত, Functorলুই ক্যাসিলাসের উত্তরের উদাহরণটি বেশ স্বজ্ঞাত। কি List<T>এবং Option<T>সাধারণভাবে কি আছে? আপনি যদি আমাকে একটি এবং একটি ফাংশন দেন তবে T -> Sআমি আপনাকে একটি List<S>বা দিতে পারি Option<S>। তাদের মধ্যে অন্য একটি জিনিস মিল রয়েছে তা হল আপনি Tউভয়ের মধ্যে একটি মান পেতে চেষ্টা করতে পারেন ।
ডোভাল

@ ডোভাল: আপনি কীভাবে প্রাক্তনটি করবেন? যতক্ষণ না কেউ পরবর্তীকালে আগ্রহী, আমি মনে করব যে উভয় প্রকার প্রয়োগ করেই এটি পরিচালনা করা যেতে পারে IReadableHolder<T>
সুপারক্যাট

@supercat আমি অনুমান করছি তারা বাস্তবায়ন করতে হবে IMappable<K<_>, T>পদ্ধতি সঙ্গে K<S> Map(Func<T, S> f), যেমন বাস্তবায়নে IMappable<Option<_>, T>, IMappable<List<_>, T>। সুতরাং K<T> : IMappable<K<_>, T>এটির কোনও ব্যবহার পেতে আপনাকে সীমাবদ্ধ করতে হবে।
গ্রেগরোস

1
Ingালাই একটি উপযুক্ত উপমা নয়। টাইপ ক্লাস (বা অনুরূপ নির্মাণ) দিয়ে যা করা হয় তা হ'ল আপনি দেখান যে কোনও প্রদত্ত প্রকার উচ্চতর ধরণের প্রকারকে কীভাবে সন্তুষ্ট করে। এটিতে সাধারণত নতুন ফাংশন সংজ্ঞায়িত করা বা বিদ্যমান ফাংশনগুলি (বা পদ্ধতিগুলি যদি এটির স্কালার মতো কোনও ওও ভাষা ব্যবহার করা যায়) ব্যবহার করা যেতে পারে। এটি হয়ে গেলে, উচ্চতর ধরণের সাথে কাজ করার জন্য সংজ্ঞায়িত যে কোনও ফাংশনগুলি সে ধরণের সাথে কাজ করবে। তবে এটি একটি ইন্টারফেসের চেয়ে অনেক বেশি কারণ একটি সাধারণ ফাংশন / পদ্ধতির স্বাক্ষরগুলির চেয়ে বেশি সংজ্ঞায়িত হয়। আমি অনুমান করি যে আমাকে কীভাবে কাজ করে তা দেখানোর জন্য একটি উত্তর লিখতে হবে।
itbruce

উত্তর:


5

যেহেতু অন্য কেউ এই প্রশ্নের উত্তর দেয়নি, আমি মনে করি আমি নিজেই এটি দিয়ে যাব। আমি কিছুটা দার্শনিক পেতে যাচ্ছি।

জেনেরিক প্রোগ্রামিং হ'ল টাইপ তথ্য না হারাতে (একইভাবে বস্তু-ভিত্তিক মান পলিমারফিজমের সাথে যা ঘটে) একই জাতীয় ধরণের বিস্মৃতকরণ সম্পর্কে। এটি করার জন্য, প্রকারগুলি অবশ্যই ব্যবহার করতে পারেন এমন কিছু প্রকারের ইন্টারফেস (অপারেশনগুলির একটি সেট, ওও শব্দটি নয়) ভাগ করে নিতে হবে।

অবজেক্ট-ওরিয়েন্টেড ভাষায়, প্রকার শ্রেণীর গুণাবলী দ্বারা ইন্টারফেসকে সন্তুষ্ট করে। প্রতিটি শ্রেণীর নিজস্ব ইন্টারফেস থাকে, এটির ধরণের অংশ হিসাবে সংজ্ঞায়িত হয়। যেহেতু সমস্ত শ্রেণি List<T>একই ইন্টারফেস ভাগ করে, তাই আপনি এমন কোড লিখতে পারেন যা Tআপনি চয়ন না করে কার্যকর হয়। ইন্টারফেস চাপানোর আরেকটি উপায় হ'ল উত্তরাধিকারের সীমাবদ্ধতা এবং যদিও দুটি ভিন্ন বলে মনে হয় তবে আপনি যদি এটির বিষয়ে চিন্তা করেন তবে সেগুলি এক রকম।

বেশিরভাগ অবজেক্ট-ওরিয়েন্টেড ভাষায়, List<>এটি নিজের মধ্যে সঠিক ধরণের নয়। এটির কোনও পদ্ধতি নেই এবং এর ফলে কোনও ইন্টারফেস নেই। শুধুমাত্র List<T>এই জিনিস আছে। মূলত, আরও প্রযুক্তিগত ভাষায়, কেবলমাত্র ধরণের ধরণের সাথেই আপনি অর্থপূর্ণভাবে বিমূর্ত করতে পারেন *। কোনও বস্তু-ভিত্তিক বিশ্বে উচ্চ-ধরণের ধরণের ব্যবহার করতে, আপনাকে এই বিধিনিষেধের সাথে সামঞ্জস্যপূর্ণ পদ্ধতিতে টাইপ সীমাবদ্ধতার বাক্যাংশ দিতে হবে।

উদাহরণ হিসেবে বলা যায়, মন্তব্য উল্লেখ হিসাবে, আমরা দেখতে পারেন Option<>এবং List<>হিসাবে "mappable হয়", অর্থে আপনি একটি ফাংশন আছে, আপনি একটি রূপান্তর করতে পারে যে Option<T>একটি মধ্যে Option<S>, অথবা একটি List<T>একটি মধ্যে List<S>। ক্লাসগুলি উচ্চতর ধরণের ধরণের জন্য সরাসরি বিমূর্ত করতে ব্যবহার করা যাবে না মনে করে, আমরা পরিবর্তে একটি ইন্টারফেস করি:

IMappable<K<_>, T> where K<T> : IMappable<K<_>, T>

এবং তারপর আমরা উভয় ইন্টারফেস বাস্তবায়ন List<T>এবং Option<T>যেমন IMappable<List<_>, T>এবং IMappable<Option<_>, T>যথাক্রমে। আমরা কি কাজ করেছি, প্রকৃত (অ-উচ্চ kinded) ধরনের জায়গা সীমাবদ্ধতার উচ্চ kinded ধরনের ব্যবহার করছে Option<T>এবং List<T>। এটি স্ক্যালায় এটিই করা হয়, যদিও অবশ্যই স্কালায় বৈশিষ্ট্য, টাইপ ভেরিয়েবল এবং অন্তর্নিহিত পরামিতিগুলির মতো বৈশিষ্ট্য রয়েছে যা এটিকে আরও স্পষ্ট করে তোলে।

অন্যান্য ভাষায়, সরাসরি উচ্চ ধরণের ধরণের উপর বিমূর্ত করা সম্ভব। টাইপ সিস্টেমে অন্যতম সর্বোচ্চ কর্তৃপক্ষ হাস্কেল-তে, আমরা কোনও ধরণের জন্য উচ্চ শ্রেণীর, এমনকি কোনও প্রকারের জন্য একটি টাইপ শ্রেণীর শব্দটি বলতে পারি। উদাহরণ স্বরূপ,

class Mappable mp where
    map :: mp a -> mp b

এই বাধ্যতা একটি (অনির্দিষ্ট) ধরনের উপর সরাসরি স্থাপন করা হয় mp, যা এক ধরনের প্যারামিটার নেয় এবং ফাংশন সঙ্গে যুক্ত করা প্রয়োজন mapযে একটি সক্রিয় mp<a>একটি মধ্যে mp<b>। তারপরে আমরা এমন ফাংশন লিখতে পারি যা উচ্চ-ধরণের প্রকারকে বাধা দেয় Mappableঠিক যেমন অবজেক্ট-ওরিয়েন্টেড ভাষায় আপনি কোনও উত্তরাধিকারের সীমাবদ্ধ রাখতে পারেন। ভাল ধরণের.

বিষয়গুলি সংক্ষেপে, উচ্চ-ধরণের ধরণের ব্যবহারের আপনার দক্ষতা এগুলিকে সীমাবদ্ধ করার ক্ষমতা বা টাইপ সীমাবদ্ধতার অংশ হিসাবে তাদের ব্যবহারের দক্ষতার উপর নির্ভর করে।


চাকরি পরিবর্তন করতে খুব ব্যস্ত হয়ে পড়েছিলেন তবে শেষ পর্যন্ত আমার নিজের উত্তরটি লেখার জন্য কিছু সময় পাবেন। যদিও আমি মনে করি আপনি সীমাবদ্ধতার ধারণা দ্বারা বিক্ষিপ্ত হয়েছেন। উচ্চতর ধরনেরগুলির একটি উল্লেখযোগ্য দিক হ'ল তারা ফাংশন / আচরণকে সংজ্ঞায়িত করার অনুমতি দেয় যা কোনও প্রকারের জন্য প্রয়োগ করা যেতে পারে যা যুক্তিযুক্তভাবে যোগ্যতার জন্য দেখানো যেতে পারে। বিদ্যমান ধরণের উপর সীমাবদ্ধতা চাপানো থেকে দূরে, ধরণের শ্রেণি (উচ্চতর ধরণেরগুলির একটি প্রয়োগ) তাদের সাথে আচরণ যুক্ত করে।
itbruce

আমি মনে করি এটি শব্দার্থবিজ্ঞানের একটি বিষয়। একটি প্রকার শ্রেণি এক ধরণের শ্রেণির সংজ্ঞা দেয়। আপনি যখন কোনও ফাংশনকে সংজ্ঞায়িত করেন, তখন আপনি টাইপ শ্রেণির সদস্য হওয়ার জন্য (Mappable mp) => mp a -> mp bএকটি সীমাবদ্ধতা রেখেছিলেন । যখন আপনি কোনও প্রকার যেমন যেমন একটি উদাহরণ হিসাবে ঘোষণা করেন , আপনি সেই ধরণের সাথে আচরণ যুক্ত করেন। আমি অনুমান করি যে আপনি কোনও ধরণের বাধা ছাড়াই স্থানীয়ভাবে এই ব্যবহারটি স্থানীয়ভাবে ব্যবহার করতে পারেন তবে এটি কোনও সাধারণ ফাংশন সংজ্ঞায়িত করার থেকে আলাদা নয়। mpMappableOptionMappable
গ্রেগরোস

এছাড়াও, আমি বেশ নির্দিষ্ট ধরণের ক্লাসগুলি উচ্চতর ধরনেরগুলির সাথে সরাসরি সম্পর্কিত নয়। স্কালায় উচ্চ-ধরণের প্রকার রয়েছে, তবে ধরণের ক্লাস নয় এবং আপনি টাইপ ক্লাসগুলিকে *ব্যবহারযোগ্য না করে প্রকারের সাথে সীমাবদ্ধ করতে পারেন । এটি অবশ্যই সত্য যে উচ্চ ধরণের ধরণের সাথে কাজ করার সময় প্রকারের শ্রেণিগুলি খুব শক্তিশালী।
গ্রেগরোস

স্কালায় টাইপ ক্লাস রয়েছে। তারা জড়িত সঙ্গে প্রয়োগ করা হয়। ফলস্বরূপ হাস্কেল ধরণের শ্রেণীর উদাহরণগুলির সমপরিমাণ সরবরাহ করে। এটি হাস্কেলের চেয়ে আরও ভঙ্গুর বাস্তবায়ন কারণ এর জন্য কোনও ডেডিকেটেড সিনট্যাক্স নেই। তবে এটি সর্বদা স্কেল জড়িয়ে যাওয়ার মূল উদ্দেশ্যগুলির মধ্যে একটি ছিল এবং তারা কাজটি করে।
itbruce
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.