টাইপ থিওরিতে সঠিক পরিভাষা: প্রকার, প্রকার নির্মাতা, প্রকার / প্রকার এবং মান


14

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

সন্দেহজনক শর্তাবলী এবং তাদের সম্পর্কের আছেন: টাইপ, টাইপ কন্সট্রাকটর, টাইপ প্যারামিটার হয়, ধরণের বা প্রকারের, এবং মান

আমি টাইপ থিওরির জন্য উইকিপিডিয়াও পরীক্ষা করেছিলাম , তবে এটি খুব বেশি স্পষ্ট করে না।

সুতরাং একটি ভাল রেফারেন্স উত্তর থাকার জন্য এবং আমার নিজের বোঝাপড়াটি পরীক্ষা করার জন্য:

  • কীভাবে এই জিনিসগুলি সঠিকভাবে সংজ্ঞায়িত করা হয়?
  • এই প্রতিটি জিনিস মধ্যে পার্থক্য কি?
  • তারা একে অপরের সাথে কীভাবে সম্পর্কিত?

উত্তর:


13

ঠিক আছে, আসুন একে একে।

মানগুলি

মানগুলি হ'ল ডেটাগুলির কংক্রিট টুকরা যা প্রোগ্রামগুলি মূল্যায়ন করে এবং জগল করে। কিছুই অভিনব, কিছু উদাহরণ হতে পারে

  • 1
  • true
  • "fizz buzz foo bar"

প্রকারভেদ

কোনও ধরণের একটি দুর্দান্ত বর্ণনা হ'ল "একটি মানের জন্য শ্রেণিবদ্ধ" ier একটি মান হ'ল রানটাইমের সময় সেই মানটি কী হবে সে সম্পর্কে কিছুটা তথ্য, তবে সংকলনের সময় নির্দেশিত।

উদাহরণস্বরূপ আপনি যদি e : boolসংকলনের সময় আমাকে বলেন এবং আমি জানব যে eএটি হয় trueবা falseরানটাইমের সময়, অন্য কিছুই নয়! যেহেতু প্রকারগুলি মূল্যগুলি সুন্দরভাবে শ্রেণিবদ্ধ করে, আমরা আপনার প্রোগ্রামের কিছু প্রাথমিক বৈশিষ্ট্য নির্ধারণ করতে এই তথ্যটি ব্যবহার করতে পারি।

উদাহরণস্বরূপ, যদি আমি কখনই আপনাকে যুক্ত করতে eএবং e'কখন e : intএবং কখন দেখি e' : String, তবে আমি জানি কিছুটা বন্ধ রয়েছে! আসলে আমি এটি পতাকাঙ্কিত করতে এবং সংকলনের সময় একটি ত্রুটি ছুঁড়ে বলতে পারি, "আরে, এতে কোনও অর্থ হয় না!"!

একটি আরও শক্তিশালী টাইপ সিস্টেম আরও আকর্ষণীয় ধরণের জন্য মঞ্জুরি দেয় যা আরও আকর্ষণীয় মানগুলিকে শ্রেণিবদ্ধ করে। উদাহরণস্বরূপ, আসুন কিছু ফাংশন বিবেচনা করা যাক

f = fun x -> x

এটি বেশ পরিষ্কার যে f : Something -> Something, কিন্তু এটি কী হওয়া উচিত Something? বিরক্তিকর ধরণের সিস্টেমে আমাদের কিছু স্বেচ্ছাচারিতা নির্দিষ্ট করতে হবে, যেমন Something = int। আরও নমনীয় ধরণের সিস্টেমে আমরা বলতে পারি

f : forall a. a -> a

বলার চেষ্টা করে "কোন জন্য a, fএকটি মানচিত্র aএকটি থেকে a"। এটি আসুন আমরা fআরও সাধারণভাবে ব্যবহার করি এবং আরও আকর্ষণীয় প্রোগ্রাম লিখি।

তদুপরি, সংকলকটি আসলে আমরা যে ক্লাসিফায়ারটি দিয়েছি তা সন্তুষ্ট করে যাচাই করতে যাচ্ছে, যদি আমাদের f = fun x -> trueতখন একটি বাগ থাকে এবং সংকলকটি তাই বলে!

সুতরাং একটি tldr হিসাবে; একটি টাইপটি রানটাইমের সময় কোনও অভিব্যক্তি হতে পারে এমন মানগুলির উপর একটি সংকলন সময় সীমাবদ্ধতা।

টাইপ কনস্ট্রাক্টর

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

ক্লাসিক উদাহরণটি একটি জেনেরিক তালিকা। এর জন্য একটি টাইপ কনস্ট্রাক্টর কেবল জেনেরিক সংজ্ঞা

 data List a = Cons a (List a) | Nil

এখন Listএকটি ফাংশন যা aসেই ধরণের মানগুলির তালিকার জন্য কোনও প্রকারের মানচিত্র করে ! জাভা-স্থলে আমি মনে করি এগুলিকে সম্ভবত "জেনেরিক ক্লাস" বলা হয়

পরামিতি টাইপ করুন

একটি টাইপ প্যারামিটার হ'ল টাইপ যা টাইপ কনস্ট্রাক্টর (বা ফাংশন) এ প্রেরণ করা হয়। মান স্তরের মতো আমরা foo(a)যেভাবে বলতে পারি একটি প্যারামিটার রয়েছে aঠিক তেমন কীভাবে List aকোনও টাইপ প্যারামিটার থাকে a

প্রকারের

ধরণগুলি কিছুটা কৃপণ। প্রাথমিক ধারণাটি হ'ল নির্দিষ্ট প্রকারগুলি একই রকম। উদাহরণস্বরূপ, আমরা জাভা সব আদিম ধরনের int, char, float... যা সব আচরণ যেন তারা একই "টাইপ" আছে। বাদে, যখন আমরা নিজেরাই টাইপ করার জন্য শ্রেণিবদ্ধের কথা বলি, তখন আমরা শ্রেণিবদ্ধীদের ধরণের বলি। সুতরাং int : Prim, String : Box, List : Boxed -> Boxed

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

 List<List>

অথবা

 List<int>

জাভাতে যেহেতু Listএকটি কংক্রিট টাইপের মতো ব্যবহার করা দরকার! যদি আমরা তাদের ধরণের List : Boxed -> Boxedএবং যেহেতু তাকান Boxed -> Boxed /= Boxed, উপরেরটি একটি দয়া করে ত্রুটি!

বেশিরভাগ সময় আমরা ধরণের সম্পর্কে সত্যই ভাবি না এবং কেবল তাদের "সাধারণ জ্ঞান" হিসাবে বিবেচনা করি না, তবে ফ্যানসিয়ার টাইপ সিস্টেমগুলির সাথে এটি ভাবতে গুরুত্বপূর্ণ।

আমি এতক্ষণ যা বলছি তার একটি ছোট উদাহরণ

 value   : type : kind  : ...
 true    : bool : Prim  : ...
 new F() : Foo  : Boxed : ...

উইকিপিডিয়া চেয়ে ভাল পঠন

আপনি যদি এই ধরণের বিষয়ে আগ্রহী হন তবে আমি একটি ভাল পাঠ্যপুস্তক বিনিয়োগের জন্য সুপারিশ করব। প্রকারের তত্ত্ব এবং সাধারণভাবে পিএলটি বেশ প্রশস্ত এবং জ্ঞানের সুসংগত ভিত্তি ছাড়াই আপনি (বা কমপক্ষে আমি) কয়েক মাস ধরে কোথাও না পেয়ে ঘুরে বেড়াতে পারেন।

আমার প্রিয় দুটি বই

  • প্রকার এবং প্রোগ্রামিং ভাষা - বেন পিয়ার্স
  • প্রোগ্রামিং ভাষার ব্যবহারিক ভিত্তি - বব হার্পার

দুটিই দুর্দান্ত বই যা আমি সবেমাত্র সুন্দর এবং সুস্পষ্টভাবে বিশদে বিশদ সম্পর্কে আরও কিছু কথা বলেছি এবং তা উপস্থাপন করে।


1
প্রকারভেদ সেট? আমি আরও ভাল "শ্রেণিবদ্ধকারী" পছন্দ করি তবে এর অর্থ কী তা আপনি ব্যাখ্যা করেন না এবং কোনও প্রকার কী তা সম্পর্কে ভাল ধারণা ছাড়া আপনার বাকী উত্তরটি ধীরে ধীরে পড়ে যায়।
রবার্ট হার্ভে

@ রবার্ট হার্ভে এটি এখন কেমন দেখাচ্ছে, আমি সেটগুলির সমস্ত উল্লেখ ফেলে রেখেছি :)
ড্যানিয়েল গ্রেটজার

1
আরও অনেক ভাল ....
রবার্ট হার্ভে

@ রবার্ট হার্ভে আমি প্রকারভেদগুলিকে খুব স্বজ্ঞাত সেট হিসাবে পাই find উদাহরণস্বরূপ intজাভা টাইপ 2 ^ 64 স্বতন্ত্র মান একটি সেট থাকে। উপ-প্রকারগুলি জড়িত হওয়ার সাথে সাথে সেটগুলির সাদৃশ্যটি ভেঙে যায় তবে এটি যথেষ্ট পর্যাপ্ত প্রাথমিক অন্তর্নিহিততা, বিশেষত একবার আপনি বীজগণিত ডেটা ধরণের বিবেচনা করলে (উদাহরণস্বরূপ দুই প্রকারের একটি ইউনিয়ন উভয় প্রকারের সদস্যকেই ধারণ করতে পারে; এটি সেটের মিল)) ।
ডোভাল

@ ডোভাল: আমি যদি কোনও ক্লাস লিখি যা কোনও গ্রাহকের বর্ণনা দেয় তবে এটি সম্ভবত গ্রাহকদের একটি "সেট" উপস্থাপন করবে, যেহেতু আমি উদাহরণগুলির সংগ্রহ করতে চলেছি। তবে এটি যে গ্রাহক একটি প্রকারের কারণ এটি গ্রাহকদের একটি "সেট" বর্ণনা করে তা হ'ল টোটোলজি; এটা সুস্পষ্ট বলে মনে হচ্ছে আরও আকর্ষণীয় বিষয় হ'ল গ্রাহক প্রকারটি কোনও গ্রাহকের বৈশিষ্ট্য বর্ণনা করে । এটি ব্যাখ্যা করার জন্য "সেট" ব্যবহার করা আরও বেশি ... বিমূর্ত যা বাস্তবে রয়েছে তার চেয়ে বেশি বলে মনে হয়। যদি না হয়, সম্ভবত আপনি একজন গণিতবিদ।
রবার্ট হার্ভে

2

কীভাবে এই জিনিসগুলি সঠিকভাবে সংজ্ঞায়িত করা হয়?

এগুলি যথাযথ, একাডেমিক গাণিতিক ব্যাক দ্বারা সঠিকভাবে সংজ্ঞায়িত করা হয়েছে, তারা কী তা, তারা কীভাবে কাজ করে এবং কী কী গ্যারান্টিযুক্ত তা নিয়ে দৃ strong় প্রতিবেদন সরবরাহ করে।

তবে প্রোগ্রামারদের মূলত এটি জানার দরকার নেই। তাদের ধারণাগুলি বুঝতে হবে।

মানগুলি

আসুন মানগুলি দিয়ে শুরু করি, যেহেতু সবকিছু সেখান থেকে তৈরি হয়। মানগুলি কম্পিউটিংয়ে ব্যবহৃত ডেটা। পদ্ধতির উপর নির্ভর করে, তারা সেই মানগুলি যার সাথে প্রত্যেকের পরিচিত: 42, 3.14, "এখন কেমন ব্রাউন গরু", অ্যাকাউন্টিংয়ে জেনি নামক কর্মীদের রেকর্ড করে etc.

মানগুলির অন্যান্য ব্যাখ্যা প্রতীক । বেশিরভাগ প্রোগ্রামাররা এই চিহ্নগুলিকে একটি গণনার "মান" বলে বোঝে। Leftএবং Rightএনামের জন্য প্রতীক Handedness(উত্সর্গকারী মানুষ এবং মাছ উপেক্ষা করে)।

বাস্তবায়ন নির্বিশেষে, মানগুলি হ'ল বিভিন্ন জিনিস যা ভাষার সাথে গণনা সম্পাদনের জন্য কাজ করে।

প্রকারভেদ

মানগুলির সাথে সমস্যাটি হ'ল সমস্ত গণনা সমস্ত মানের জন্য বৈধ নয়। 42 + goatসত্যিকার অর্থে বোঝায় না।

প্রকারভেদগুলি এখানে আসে। প্রকারগুলি হ'ল মেটাডেটা যা মানগুলির উপগঠন সংজ্ঞায়িত করে। HandednessEnum উপরে একটি ভাল উদাহরণ। এই ধরণটি "শুধুমাত্র Leftএবং Rightএখানে ব্যবহার করা যেতে পারে" বলে। এটি প্রোগ্রামগুলিকে খুব তাড়াতাড়ি নির্ধারণ করতে দেয় যে নির্দিষ্ট ক্রিয়াকলাপগুলির ফলে ত্রুটি ঘটবে।

বিবেচনা করার জন্য আরেকটি ব্যবহারিক ব্যবহার হুডের নিচে কম্পিউটারগুলি বাইট নিয়ে কাজ করে। বাইট 42 এর অর্থ 42 নম্বর হতে পারে, বা এর অর্থ চরিত্রের অর্থ হতে পারে বা জেনির অর্থ অ্যাকাউন্টিং হতে পারে। প্রকারগুলি (ব্যবহারিক ব্যবহারে, তাত্ত্বিক এত বেশি নয়) কম্পিউটার দ্বারা ব্যবহৃত বাইটের অন্তর্নিহিত সংগ্রহের জন্য এনকোডিং সংজ্ঞায়িত করতে সহায়তা করে।

প্রকারের

এবং এখানে আমরা যেখানে একটু বাইরে যেতে শুরু করি। সুতরাং যখন একটি প্রোগ্রামিং ভাষা একটি পরিবর্তনশীল যে একটি টাইপ বোঝায় আছে, কি ধরনের নেই এটা আছে?

উদাহরণস্বরূপ জাভা এবং সি # তে এর টাইপ রয়েছে Type(যা টাইপটি রয়েছে Type, যা আছে ... এবং সমস্ত পথে নামা)। এই ধরণের পিছনে ধারণা । কিছু ভাষায়, আপনি জাভা এবং সি # এর চেয়ে টাইপ ভেরিয়েবলের সাহায্যে কিছুটা দরকারী জিনিস করতে পারেন। একবার যে ঘটবে এটা বলতে দরকারী হয়ে "আমি একটি প্রকার যে একটি মান চাই, কিন্তু কিছু হয় ধরনের এর IEnumerable<int>"। Ta-দা! ধরণের।

বেশিরভাগ প্রোগ্রামার জাভা এবং সি # জেনেরিক সীমাবদ্ধতার মতো ধরণের সম্পর্কে ভাবতে পারেন। বিবেচনা করুন public class Foo<T> where T: IComparable{}। প্রকারের ভাষায়, T: kindOf(IComparable)পরিবর্তনশীল ঘোষণা বৈধ হয়ে যায়; ক্লাস এবং ফাংশন ঘোষণায় আপনি করতে পারেন এমন একটি বিশেষ জিনিস নয়।

টাইপ কনস্ট্রাক্টর

সম্ভবত আশ্চর্যজনকভাবে, টাইপ কনস্ট্রাক্টরগুলি কেবল প্রকারের জন্য নির্মাণকারী । "কিন্তু কিভাবে আপনি একটি টাইপ গঠন করা না? প্রকারভেদ মাত্র হয় ।"। এহ ... এত কিছু না।

আশ্চর্যজনকভাবে, কোনও কম্পিউটার প্রোগ্রাম কখন ব্যবহার করবে মানগুলির বিভিন্ন দরকারী সাবসেটগুলির সবগুলি তৈরি করা বেশ কঠিন । টাইপ কনস্ট্রাক্টররা প্রোগ্রামারদের অর্থ উপায়ে সেই সাবসেটগুলিকে "বিল্ড" করতে সহায়তা করার জন্য কাজ করে।

একটি টাইপ কন্সট্রাকটর অধিকাংশ সর্বব্যাপী উদাহরণ একটি অ্যারের সংজ্ঞা হল: int[4]। এখানে আপনি 4টাইপ কনস্ট্রাক্টরকে নির্দিষ্ট করছেন , যা আপনাকে int4 টি এন্ট্রি দিয়ে একটি অ্যারে তৈরি করতে মান ব্যবহার করে । আপনি যদি কোনও আলাদা ইনপুট প্রকার নির্দিষ্ট করে থাকেন তবে আপনি আলাদা আউটপুট প্রকার পাবেন।

জেনেরিক্স টাইপ কনস্ট্রাক্টরের অন্য রূপ, তাদের ইনপুট হিসাবে অন্য ধরণের গ্রহণ করে।

অনেক ভাষায় একটি টাইপ কনস্ট্রাক্টর থাকে এমন টাইপ P -> Rবানাতে যা টাইপ Pএবং রিটার্ন টাইপ করে এমন ফাংশনকে প্রতিনিধিত্ব করে R

এখন, প্রসঙ্গটি নির্ধারণ করবে যে "ফাংশন যা টাইপ দেয়" টাইপ কনস্ট্রাক্টর কিনা। আমার (স্বীকৃতভাবে সীমাবদ্ধ) অভিজ্ঞতায় লাইনটি "আপনি কি এই ধরণের সংকলন সময়ে ব্যবহার করতে পারবেন?" হ্যাঁ? টাইপ কনস্ট্রাক্টর কোন? শুধু একটি ফাংশন।

পরামিতি টাইপ করুন

সুতরাং আপনি কি মনে করেন টাইপ কনস্ট্রাক্টরগুলিতে পাস করা প্যারামিটারগুলি? তারা সাধারণভাবে, প্রকার পরামিতি হিসাবে পরিচিত করছি সাল থেকে প্রকার রচয়িতা সাধারণ ফর্ম Type[param]বা Type<param>


1
আপনি কি 'ধরণের' সম্পর্কে বিভাগটি পরিষ্কার / প্রসারিত করতে পারেন? হাস্কেলের মধ্যে একটি ধরণের ধরণ থাকে *, তবে প্রকারের নির্মাণকারী (এক যুক্তির সাথে) ধরনের থাকে * -> *। সীমাবদ্ধতা যেমন (Num a) => a(অর্থ " aযে কোনও প্রকার যা Numটাইপক্লাসের উদাহরণ ") তারা নিজেরাই ধরণের নয়। টাইপক্লাস Numনিজেই 'ধরণের' নয়, তবে ধরণের রয়েছে * -> Constraint। আপনার দেওয়া উদাহরণগুলির সাথে 'ধরণের' (যা আমি মনে করি টাইপ তত্ত্বের ধরণের সাথে ঘনিষ্ঠভাবে জড়িত?) এর হাস্কেল ধারণাটি সম্পর্কিত করা আমার পক্ষে কঠিন মনে হয়েছে।
জন বার্থোলোমিউ

আমি বলতে হবে, ghci এর :kindকমান্ড ধরনের দেয় Numযেমন * -> Constraint। এটি জিএইচসির সাথে নির্দিষ্ট হতে পারে, আমি জানি না।
জন বার্থোলোমিউ

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