এক প্রকার এবং এক ধরণের মধ্যে পার্থক্য কী?


26

আমি প্রোগ্রামিং ল্যাঙ্গেজ হাস্কেল শিখছি, এবং আমি আমার মাথাটি গুটিয়ে দেওয়ার চেষ্টা করছি যে এ typeএবং এ এর মধ্যে পার্থক্য kindকী।

আমি এটা বুঝতে হিসাবে a kind is a type of type,। উদাহরণস্বরূপ, a ford is a type of carএবং a car is a kind of vehicle

এটি সম্পর্কে চিন্তা করার ভাল উপায় কি?

কারণ, আমার মস্তিষ্কটি বর্তমানে যেভাবে তারযুক্ত, একটি ford is a **type** of car, car is a **type** of vehicleএকই সময়ে যখন একটি car is a **kind** of vehicle। অর্থাত্ শর্তাদি typeএবং kindবিনিময়যোগ্য।

কেউ কি এই বিষয়ে কিছু আলোকপাত করতে পারে?


6
আমি কেবল স্ট্যাক ওভারফ্লো পোস্ট থেকে এখানে এসেছি যা এই আলোচনার দিকে পরিচালিত করেছে। আমি নিশ্চিত নই যে আমি বিস্তারিতভাবে উত্তর দেওয়ার যোগ্যতা অর্জন করেছি - তবে আপনি অবশ্যই ইংরেজিতে তাদের অর্থের সাথে সম্পর্কিত হওয়ার চেষ্টা করে "টাইপ" এবং "ধরণ" শব্দটি সম্পর্কে সত্যই আক্ষরিক হয়ে উঠছেন (যেখানে তারা সত্যিকার অর্থে প্রতিশব্দ) )। আপনি তাদের প্রযুক্তিগত পদ হিসাবে বিবেচনা করা উচিত। "প্রকার" সমস্ত প্রোগ্রামার দ্বারা ভালভাবে বোঝা যায়, আমি ধরে নিই, কারণ ধারণাটি প্রতিটি ভাষার পক্ষে অত্যাবশ্যক, এমনকি জাভাস্ক্রিপ্টের মতো দুর্বল-টাইপযুক্ত, "কিন্ড" একটি প্রযুক্তিগত শব্দ যা "ধরণের ধরণের" জন্য হ্যাসকেলে ব্যবহৃত হয়। সত্যিই এটি আছে।
রবিন জিগমন্ড

2
@ রবিনজাইগমন্ড: আপনি ঠিক বলেছেন যে এগুলি প্রযুক্তিগত পদসমূহ, তবে এগুলি কেবল হাস্কেলের চেয়ে বেশি ব্যবহৃত হয়। সম্ভবত স্ট্যাক ওভারফ্লো আলোচনার ব্যাকলিংক যা এই প্রশ্নটির জন্ম দেয়?
আন্দ্রেজ বাউর 22

@ আন্ড্রেজবাউর আমি কখনই বলিনি যে এগুলি হাস্কেলের বাইরে ব্যবহার করা হয়নি, অবশ্যই আমি বলেছি, প্রতিটি ভাষায় "টাইপ" ব্যবহৃত হয়। আমি বাস্তবে হাস্কেলের বাইরে কখনও "সদয়" হয়ে উঠতে পারি নি, তবে হাসকেলই আমি একমাত্র কার্যকরী ভাষা যা আমি জানি এবং আমি এই শব্দটি অন্য কোথাও ব্যবহার না করা সতর্ক করেছিলাম, ঠিক এইভাবে এটি ব্যবহৃত হয় Haskell,। (এবং লিঙ্কটি, যেমন আপনি অনুরোধ করেছেন, এখানে রয়েছে )
রবিন জিগমন্ড

এমএল-পারিবারিক ভাষাগুলিতেও প্রকার রয়েছে, উদাহরণস্বরূপ স্ট্যান্ডার্ড এমএল এবং ওক্যামেল। তারা মনে করে যে এই নামটি দিয়ে স্পষ্টভাবে প্রকাশ করা হয়নি, আমি মনে করি। এগুলি স্বাক্ষর হিসাবে প্রকাশিত হয় এবং তাদের উপাদানগুলিকে কাঠামো বলা হয় ।
আন্দ্রেজ বাউর

1
আরও নির্ভুল ইংরেজি উপমা হ'ল ফোর্ড হ'ল এক ধরণের গাড়ি এবং গাড়ি এক ধরণের যানবাহন তবে গাড়ি-ধরণের এবং যানবাহনের ধরণ উভয়ই একই ধরণের: বিশেষ্য। যেখানে লাল এক ধরণের গাড়ির রঙ এবং আরপিএম এক ধরণের গাড়ি পারফরম্যান্স মেট্রিক এবং উভয়ই একই ধরণের: বিশেষণ।
slebetman

উত্তর:


32

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

আমার উত্তরটি বিশেষত হাস্কেলের প্রসঙ্গে এই শর্তগুলির আনুষ্ঠানিক অর্থের সাথে সম্পর্কিত; এই অর্থগুলি গাণিতিক / সিএস "টাইপ থিওরি" তে ব্যবহৃত অর্থগুলির (যদিও এর সাথে সত্যই অভিন্ন নয়) উপর ভিত্তি করে। সুতরাং, এটি খুব ভাল "কম্পিউটার বিজ্ঞান" উত্তর হবে না, তবে এটি হাস্কেলের একটি উত্তম উত্তর হিসাবে পরিবেশন করা উচিত।

হাস্কেল (এবং অন্যান্য ভাষাগুলিতে), এটি এমন কোনও প্রোগ্রামের এক্সপ্রেশনটিতে একটি টাইপ নির্ধারণে সহায়ক হতে সাহায্য করে যা এক্সপ্রেশনটির অনুমোদিত মানগুলির শ্রেণীর বর্ণনা দেয়। আমি এখানে অনুমান আপনি যথেষ্ট উদাহরণ দেখা করেছি বুঝতে কেন এটা জানাতে চাই যে এক্সপ্রেশনে দরকারী হবে sqrt (a**2 + b**2), ভেরিয়েবল aএবং bসবসময় ধরনের মান হতে হবে Doubleএবং বলে, Stringএবং Boolযথাক্রমে। মূলত, প্রকারভেদগুলি আমাদের বহিঃপ্রকাশ / প্রোগ্রাম লিখতে সহায়তা করে যা বিভিন্ন ধরণের মানকে সঠিকভাবে কাজ করবে ।

এখন, এমন কিছু যা আপনি বুঝতে পারেননি তা হ্যাস্কেল প্রকার, স্বাক্ষর টাইপের মতো:

fmap :: Functor f => (a -> b) -> f a -> f b

এগুলি আসলে একটি টাইপ-লেভেল হাস্কেল সাবল্যাংগয়েজে লেখা। প্রোগ্রামের পাঠ্যটি Functor f => (a -> b) -> f a -> f bহ'ল - বেশ আক্ষরিক - এই সাবল্যাংগুয়েজে একটি টাইপ প্রকাশ । Sublanguage অপারেটার অন্তর্ভুক্ত (যেমন, ->এই ভাষাতে অধিকার মিশুক পোতা অপারেটর), ভেরিয়েবল (যেমন, f, a, এবং b), এবং অন্য এক ধরনের মত প্রকাশের "APPLICATION" (যেমন, f aহয় fপ্রয়োগ a)।

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

সুতরাং, মান হয় ধরনের যেমন ধরনের হয় ধরণের , এবং ধরনের আমাদের লিখুন সাহায্য মান পর্যায়ের প্রোগ্রাম যখন ধরণের আমাদের লিখুন সাহায্য টাইপ পর্যায়ের প্রোগ্রাম।

এই ধরণের দেখতে কেমন? ভাল, স্বাক্ষর টাইপ বিবেচনা করুন:

id :: a -> a

টাইপ অভিব্যক্তি যদি a -> aবৈধ বলে, কি ধরনের এর ধরনের আমরা পরিবর্তনশীল অনুমতি উচিত aহবে? ঠিক আছে, টাইপ এক্সপ্রেশন:

Int -> Int
Bool -> Bool

বৈধ দেখতে, তাই প্রকারগুলি Int এবং Boolস্পষ্টতই সঠিক ধরণের । তবে আরও জটিল ধরণের যেমন:

[Double] -> [Double]
Maybe [(Double,Int)] -> Maybe [(Double,Int)]

বৈধ চেহারা। প্রকৃতপক্ষে, যেহেতু আমাদের idক্রিয়াকলাপগুলি করতে সক্ষম হওয়া উচিত , এমনকি:

(a -> a) -> (a -> a)

দেখতে ভাল. সুতরাং, Int, Bool, [Double], Maybe [(Double,Int)], এবং a -> aমত সব বর্ণন ধরনের অধিকার ধরনের

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

রাইট?

ভাল, বেশ না। এটি প্রমাণিত হয় যে Maybe, এটি নিজেই, কোনও প্রকারের মত প্রকাশের মতোই বৈধ Maybe Int(অনেকগুলি একইভাবে sqrt, নিজে থেকে, যেমন একটি মূল্য প্রকাশের মত বৈধ sqrt 25)। তবে , নিম্নলিখিত ধরণের অভিব্যক্তিটি বৈধ নয়:

Maybe -> Maybe

কারণ, যখন Maybeএকটি টাইপ অভিব্যক্তি, এটা প্রতিনিধিত্ব করে না ধরনের এর টাইপ মান করতে পারেন। সুতরাং, যে আমরা কিভাবে সংজ্ঞায়িত করা উচিত *- এটা ধরনের এর ধরনের আছে মান; এটা পছন্দ "সম্পূর্ণ" ধরনের রয়েছে Doubleবা Maybe [(Double,Int)]কিন্তু বাদ অসম্পূর্ণ, মূল্যহীন ধরনের পছন্দ Either String। সরলতার জন্য, আমি এই ধরণের সম্পূর্ণ ধরণের *"কংক্রিট প্রকারগুলি" বলব , যদিও এই পরিভাষা সর্বজনীন নয়, এবং "কংক্রিটের ধরণ" বলতে একটি সি ++ প্রোগ্রামার বলতে খুব আলাদা কিছু বোঝায়।

এখন, টাইপ এক্সপ্রেশনে a -> a, যতদিন প্রকার aহয়েছে ধরনের * (কংক্রিট ধরনের ধরনের), টাইপ মত প্রকাশের ফলাফলের a -> aহবে এছাড়াও আছে ধরনের * (অর্থাত, কংক্রিট ধরনের ধরনের)।

সুতরাং, এ ধরনের এর টাইপ হয় Maybe? ভাল, Maybeঅন্য একটি কংক্রিট ধরণের উত্পাদন করতে একটি কংক্রিট টাইপ প্রয়োগ করা যেতে পারে। সুতরাং,Maybe একটি টাইপ-স্তরের ফাংশন যে একটি লাগে মত একটু মত দেখাচ্ছে টাইপ এর ধরনের * এবং একটি ফেরৎ টাইপ এর ধরনের * । আমরা যদি একটি মান স্তর ফাংশন যে একটি গ্রহণ ছিল মান এর টাইপ Int এবং ফিরে মান এর টাইপ Int আমরা এটিকে দিতে চাই টাইপ স্বাক্ষর Int -> Int, তাই উপমা দ্বারা আমরা দিতে হবে Maybeএকটি ধরনের স্বাক্ষর * -> *। জিএইচসিআই সম্মত:

> :kind Maybe
Maybe :: * -> *

এখানে ফিরে যাচ্ছি:

fmap :: Functor f => (a -> b) -> f a -> f b

এই ধরণের স্বাক্ষরে, ভেরিয়েবলের fदयालु * -> *এবং ভেরিয়েবল থাকে aএবং bপ্রকার থাকে *; অন্তর্নির্মিত অপারেটরের ->দয়া আছে * -> * -> *(এটি *বাম দিকে এবং ডানদিকে একটি ধরণের ধরণের লাগে এবং এক ধরণের ধরণের ফেরত দেয় *)। এগুলি এবং ধরণের অনুমানের নিয়মগুলি থেকে, আপনি অনুমান করতে পারেন যে a -> bপ্রকারের সাথে একটি বৈধ প্রকার *, f aএবং f bপ্রকারের সাথে বৈধ প্রকার *এবং (a -> b) -> f a -> f bবৈধ প্রকারের *

অন্য কথায়, সংকলকটি (a -> b) -> f a -> f bসঠিক প্রকারের ভেরিয়েবলের জন্য বৈধভাবে ভেরিয়েবলের জন্য বৈধ যাচাই করার জন্য টাইপ এক্সপ্রেশনটি "টাইপ চেক" sqrt (a**2 + b**2)করতে পারে এটি সঠিক ধরণের ভেরিয়েবলের জন্য বৈধ যাচাই করার জন্য "পরীক্ষা করে" টাইপ করে।

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

এর কয়েকটি historicalতিহাসিকও। জিএইচসি হাস্কেল যেমন বিকশিত হয়েছে, মান, প্রকার এবং প্রকারের মধ্যে পার্থক্য ঝাপসা হতে শুরু করেছে। এই দিনগুলিতে মানগুলি প্রকারে "প্রচারিত" হতে পারে এবং প্রকার এবং প্রকারগুলি সত্যই একই জিনিস। সুতরাং, আধুনিক হাস্কেলতে, উভয়ই মানগুলির প্রকার এবং এআরই প্রকারগুলি (প্রায়) রয়েছে এবং প্রকারের ধরণগুলি কেবল আরও প্রকারের।

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

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

তবে, আপনি যদি উপযুক্ত এক্সটেনশানগুলি চালু করেন তবে প্রকার এবং প্রকারের মধ্যে পার্থক্য মূলত অদৃশ্য হয়ে যায়। উদাহরণ স্বরূপ:

{-# LANGUAGE GADTs, TypeInType #-}
data Foo where
  Bar :: Bool -> * -> Foo

এখানে, Bar(একটি মান এবং উভয়) এক প্রকার। একটি প্রকার হিসাবে, এটির ধরণটি Bool -> * -> Foo, যা একটি ধরণের স্তরের ফাংশন যা এক ধরণের Bool(যা একটি ধরণের, তবে এক ধরণের) এবং এক ধরণের ধরণের লাগে এবং এক প্রকারের *উত্পাদন করে Foo। তাই:

type MyBar = Bar True Int

সঠিকভাবে দয়া করে-চেক।

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


যদি "প্রকার এবং প্রকারগুলি সত্যই একই জিনিস হয়", তবে ধরণটি typeকেবল typeনিজেরাই, এবং কোনও প্রয়োজন নেই kind। সুতরাং স্পষ্টভাবে পার্থক্য কি?
ব্যবহারকারী 21820

1
@ ব্যবহারকারী21820, আমি শেষের দিকে একটি নোট যুক্ত করেছি যাতে এটি সুরাহা হতে পারে। সংক্ষিপ্ত উত্তর: আধুনিক জিএইচসি হাস্কেলের মধ্যে আসলেই কোনও পার্থক্য নেই ।
কেএ বুহর

1
এটি একটি দুর্দান্ত উত্তর - ভাগ করে নেওয়ার জন্য অনেক ধন্যবাদ। এটি ভালভাবে লেখা এবং ধারণাগুলি ধীরে ধীরে পরিচিতি দেয় - যে কেউ কয়েক বছর ধরে হাস্কেল লিখেছেন না, এটি খুব প্রশংসিত!
আলট্রাফেজ

@ কাবুহর: যোগ হওয়া এই বিটের জন্য ধন্যবাদ!
ব্যবহারকারী 21820

19

টিYপি:আমিএন=গুলিটি:একটিগুলিগুলি

  • Bool এক প্রকার
  • Type এটি একটি ধরণের কারণ এর উপাদানগুলি ধরণের
  • Bool -> Int এক প্রকার
  • Bool -> Type এটি একটি ধরনের কারণ এর উপাদানগুলি ফাংশনগুলি যা প্রত্যাবর্তন করে
  • Bool * Int এক প্রকার
  • Bool * Type এটি এক ধরণের কারণ এর উপাদানগুলি একটি উপাদানগুলির সাথে এক ধরণের জোড়া হয়

টাইপ থিওরিতে সাধারণত সব ধরণের প্রকার থাকা (এটি ক্ষমা করে দেয়) অনাকাঙ্ক্ষিত। পরিবর্তে, আমরা মহাবিশ্ব থাকতে পারে, যা অন্যান্য, ছোট ধরণের ধারণ করে। উদাহরণস্বরূপ, আমরা মহাবিশ্বের একটি সিরিজ থাকতে পারেইউ0ইউ1ইউ2ইউ0বিএনএকটিটিএনএকটিটিএনএকটিটিইউ1ইউ0বিইউ0ইউ0ইউ0ইউএন+ +1ইউএনইউএন×

ইউ0ইউ1ইউ0ইউ1ইউ0**U_1


2
আমি মনে করি না (জিএইচসি) হাস্কেলের মহাবিশ্বের কোনও ধারণা আছে। Type :: Typeএকটি axiom হয়। "টাইপ" এবং "ধরনের" এর মধ্যে পার্থক্য পুরোপুরি মানব ভাষায়, সেই ক্ষেত্রে। Trueএকটি টাইপ আছে, Boolএবং Boolএকটি টাইপ আছে Type, যা নিজেই টাইপ আছে Type। কখনও কখনও আমরা কোনও প্রকারকে একটি ধরণের বলে থাকি, এটি জোর দেওয়ার জন্য যে এটি টাইপ-লেভেল সত্তার ধরণ, তবে, হাস্কেলের মধ্যে এটি এখনও কেবল একটি প্রকার। এমন একটি সিস্টেমে যেখানে মহাবিশ্বগুলি বাস্তবে বিদ্যমান থাকে, যেমন কাক, তারপরে "টাইপ" একটি মহাবিশ্বকে এবং অন্যরকম "দয়াবান" বলতে পারে তবে আমরা সাধারণত অসীম বহু মহাবিশ্ব চাই।
এইচটিএনডাব্লু

1
পার্থক্যটি কেবল "মানব ভাষা" নয়, এটি অন্তর্নিহিত টাইপ সিস্টেমে একটি আনুষ্ঠানিক পার্থক্য। উভয় Type :: Typeএবং প্রকার এবং প্রকারের মধ্যে পার্থক্য পাওয়া বেশ সম্ভব । এছাড়াও, কোডের কোন টুকরা Type :: Typeহাস্কেলের মধ্যে প্রদর্শন করে?
আন্দ্রেজ বাউর

1
আমার এও বলা উচিত যে *হাস্কেল হ'ল এক প্রকারের মহাবিশ্ব। তারা এটিকে কেবল ডাকেন না।
আন্দ্রেজ বাউর

3
@AndrejBauer Typeথেকে Data.Kindsএবং *হওয়া উচিত প্রতিশব্দের। প্রাথমিকভাবে আমাদের কেবলমাত্র *একটি আদিম হিসাবে ছিল , যখন আজকাল এটি অভ্যন্তরীণভাবে GHC.Types.Typeঅভ্যন্তরীণ মডিউল GHC.Typesহিসাবে সংজ্ঞায়িত হয়, পরিবর্তে হিসাবে সংজ্ঞায়িত হয় type Type = TYPE LiftedRep। আমি মনে করি TYPEপ্রকৃত আদিম, এটি ধরণের পরিবার সরবরাহ করে (উত্তোলিত ধরণের, আনবক্সযুক্ত প্রকারের ...)। এখানে বেশিরভাগ "অকার্যকর" জটিলতা হ'ল কিছু নিম্ন-স্তরের অপ্টিমাইজেশান সমর্থন করা, এবং প্রকৃত ধরণের তাত্ত্বিক কারণে নয়।
চি

1
আমি সংক্ষিপ্ত করার চেষ্টা করব। যদি vএকটি মান হয়, তাহলে এটা এক ধরনের আছে: v :: T। তাহলে Tএক প্রকার, তাহলে এটি একটি টাইপ রয়েছে: T :: K। ধরণের ধরণটিকে তার ধরণের বলা হয়। TYPE repশব্দটি অস্বাভাবিক হলেও এই ধরণের ধরণের প্রকারভেদগুলিকে বাছাই বলা যেতে পারে। Iff T :: TYPE repহয় Tএকটি এর RHS প্রদর্শিত অনুমতি দেওয়া হয় ::। "সদয়" শব্দটির সাথে সংকোচ রয়েছে: KT :: Kএক ধরণের, তবে v :: Kএটি একই নয় , যদিও এটি একই K। আমরা সংজ্ঞায়িত করতে পারি " Kএটি একটি ধরণের, যদি এর ধরণের ধরণের হয়" ওরফে "প্রকারগুলি এর আরএইচএসে থাকে ::", তবে এটি ব্যবহারটি সঠিকভাবে ক্যাপচার করে না। সুতরাং আমার "মানুষের পার্থক্য" অবস্থান।
এইচটিএনডাব্লু

5

একটি মান হ'ল নির্দিষ্ট ফোর 2011 এর মতো ফোর্ড মুস্তং এর সাথে 19,206 মাইল রয়েছে যা আপনি নিজের ড্রাইভওয়েতে বসেছেন।

এই নির্দিষ্ট মানটি অনানুষ্ঠানিকভাবে বিভিন্ন ধরণের হতে পারে : এটি একটি মুস্তং, এবং এটি একটি ফোর্ড এবং এটি একটি গাড়ী এবং এটি একটি যান, যা আপনি তৈরি করতে পারেন এমন আরও অনেক ধরণের মধ্যে রয়েছে ("ধরণের ধরণের জিনিস" আপনার "বা" লাল জিনিসগুলির ধরণ ", বা ...) এর ধরণ।

(হাস্কেল-এ, প্রথম অর্ডার সন্নিবেশের জন্য (জিএডিডিগুলি এই সম্পত্তিটি ভেঙে দেয়, এবং সংখ্যার লিটারাল এবং ওভারলোডেড স্ট্রিংস এক্সটেনশানটির চারপাশের যাদু এটি কিছুটা অস্পষ্ট করে দেয়)), মানগুলি অনানুষ্ঠানিক "প্রকারের" আধিক্যের পরিবর্তে একটি মূল প্রকার থাকে যা আপনি দিতে পারেন ' স্ট্যাং। 42এই ব্যাখ্যাটির উদ্দেশ্যে, একটি Int; "সংখ্যা" বা "এমনকি পূর্ণসংখ্যার" জন্য হাস্কেলের কোনও প্রকার নেই, বরং আপনি এটি তৈরি করতে পারেন, তবে এটি একটি বিচ্ছিন্ন প্রকার হতে পারেInt ))

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

(আবার, হাস্কেল কেবল প্রতিটি ধরণের স্তরের জিনিসগুলির জন্য এক ধরণের স্বীকৃতি দেয় So তাই Intদয়াবান *, এবং অন্য কোনও ধরণের নয় Maybekind দয়াবান * -> *এবং অন্য কোনও ধরণের। তবে অন্তর্দৃষ্টিটি এখনও রাখা উচিত: 42এটি একটি Int, এবং আপনি Intএটি দিয়ে ওয়াই জিনিসগুলি করতে পারেন সংযোজন এবং বিয়োগের মতো Intitself নিজেই এটি নয়, এর Intমতো কোনও সংখ্যা নেই Int + IntYou আপনি অনানুষ্ঠানিকভাবে লোকদের বলতে শুনতে পাচ্ছেন যে Intএটি একটি Num, যার অর্থ তারা এই ধরণের ধরণের শ্রেণির উদাহরণ রয়েছে - এটি একই জিনিস নয় বলার অপেক্ষা রাখে না যে হিসাবে হয়েছে ধরনের । রকম "টাইপ", যা মধ্যে Haskell বানান রয়েছে ।)NumIntInt NumInt*

সুতরাং প্রতিটি অনানুষ্ঠানিক "টাইপ" কেবল একটি বিশেষ্য বা একটি বিভাগ নয়? সব ধরণের কি একই রকম থাকে? তারা এতটা বিরক্তিকর হলে কেন প্রকারের বিষয়ে কথা বলবেন?

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

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

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

(তেমনিভাবে, আমরা যখন হাস্কেলকে Maybeদয়া করে বলি * -> *, আমাদের অর্থ "অ" থাকার বিষয়ে কথা বলার জন্য এটি অযৌক্তিক (আনুষ্ঠানিকভাবে; অনানুষ্ঠানিকভাবে আমরা এটি সর্বদা করি) MaybeInstead পরিবর্তে, আমরা একটি Maybe Intবা একটি রাখতে পারি Maybe String, যেহেতু এগুলি জিনিসগুলি সদয় *।)

সুতরাং প্রকারভেদে কথা বলার পুরো বিষয়টিটি হ'ল যাতে আমরা "মালিক" এর মতো শব্দের চারপাশে আমাদের যুক্তিটিকে আনুষ্ঠানিক রূপ দিতে পারি এবং প্রয়োগ করি যে আমরা কেবলমাত্র "সম্পূর্ণরূপে নির্মিত" এবং অযৌক্তিক নয় এমন ধরণের মূল্যবোধ গ্রহণ করি।


1
আমি বলছি না যে আপনার উপমাটি ভুল, তবে আমি মনে করি এটি বিভ্রান্তির কারণ হতে পারে। ডিজকস্ট্রার উপমা সম্পর্কে কিছু শব্দ রয়েছে। গুগল "সত্যিই কম্পিউটিং বিজ্ঞান শেখানোর নিষ্ঠুরতার উপর"।
রাফায়েল কাস্ত্রো 23

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

1

যেমনটি আমি এটি বুঝতে পারি, একটি ধরণ হ'ল এক প্রকারের।

এটি ঠিক - তাই এর অর্থ কী তা আবিষ্কার করি। Intবা Textকংক্রিটের ধরণের, তবে Maybe aএটি একটি বিমূর্ত প্রকার। aকোনও নির্দিষ্ট ভেরিয়েবলের জন্য (বা মান / অভিব্যক্তি / যাই হোক) উদাহরণস্বরূপ আপনি কোন নির্দিষ্ট মানটি চান তা সিদ্ধান্ত না দেওয়া পর্যন্ত এটি কোনও কংক্রিটের ধরণ হয়ে উঠবে না Maybe Text

আমরা বলি যে Maybe aএটি একটি প্রকারের নির্মাণকারী কারণ এটি একটি ফাংশনের মতো যা একটি একক কংক্রিটের ধরণের (যেমন Text) নেয় এবং একটি কংক্রিটের প্রকার ( Maybe Textএই ক্ষেত্রে) প্রদান করে। তবে অন্যান্য ধরণের নির্মাতারা কোনও কংক্রিটের ধরণ ফেরার আগে আরও "ইনপুট প্যারাম" নিতে পারেন। উদাহরণস্বরূপ, কংক্রিটের ধরণের ( ) নির্মাণের আগে Map k vদুটি কংক্রিট ধরণের (যেমন Intএবং Text) নেওয়া দরকার Map Int Text

সুতরাং, Maybe aএবং List aটাইপ নির্মাতাদের একই "স্বাক্ষর" রয়েছে যা আমরা হিসাবে চিহ্নিত করি * -> *(একইভাবে হাস্কেল ফাংশন স্বাক্ষরের অনুরূপ) কারণ আপনি যদি তাদের একটি কংক্রিট টাইপ দেন তবে তারা একটি কংক্রিটের ধরণ ছাড়বে। আমরা এটিকে টাইপের "ধরণী" বলি Maybeএবং Listএকই ধরণের রয়েছে।

কংক্রিটের ধরণগুলি ধরণের বলে মনে হয় *এবং আমাদের মানচিত্রের উদাহরণটি দয়ালু * -> * -> *কারণ এটি একটি কংক্রিটের আউটপুট দেওয়ার আগে ইনপুট হিসাবে দুটি ধরণের কংক্রিট গ্রহণ করে।

আপনি দেখতে পাবেন এটি বেশিরভাগ "পরামিতি" এর সংখ্যার প্রায় যা আমরা টাইপ কনস্ট্রাক্টরের কাছে প্রেরণ করি - তবে বুঝতে পারি যে আমরা টাইপ কনস্ট্রাক্টরের অভ্যন্তরে টাইপ কনস্ট্রাক্টরও পেতে পারি, সুতরাং আমরা * -> (* -> *) -> *উদাহরণস্বরূপ দেখতে পাই এমন একটি প্রান্ত দিয়ে শেষ করতে পারি ।

আপনি যদি স্কেল / জাভা দেব হন তবে আপনি এই ব্যাখ্যাটি সহায়কও পেতে পারেন: https://www.atlassian.com/blog/archives/scala-types-of-a-higher-kind


এটি সঠিক নয়। Haskell, আমরা মধ্যে পার্থক্য Maybe aজন্য একটি প্রতিশব্দ, forall a. Maybe a, ধরনের একটি বহুরুপী টাইপ *, এবং Maybe, ধরনের একটি monomorphic টাইপ * -> *
b0fh
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.