ঠিক আছে, আসুন একে একে।
মানগুলি
মানগুলি হ'ল ডেটাগুলির কংক্রিট টুকরা যা প্রোগ্রামগুলি মূল্যায়ন করে এবং জগল করে। কিছুই অভিনব, কিছু উদাহরণ হতে পারে
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 : ...
উইকিপিডিয়া চেয়ে ভাল পঠন
আপনি যদি এই ধরণের বিষয়ে আগ্রহী হন তবে আমি একটি ভাল পাঠ্যপুস্তক বিনিয়োগের জন্য সুপারিশ করব। প্রকারের তত্ত্ব এবং সাধারণভাবে পিএলটি বেশ প্রশস্ত এবং জ্ঞানের সুসংগত ভিত্তি ছাড়াই আপনি (বা কমপক্ষে আমি) কয়েক মাস ধরে কোথাও না পেয়ে ঘুরে বেড়াতে পারেন।
আমার প্রিয় দুটি বই
- প্রকার এবং প্রোগ্রামিং ভাষা - বেন পিয়ার্স
- প্রোগ্রামিং ভাষার ব্যবহারিক ভিত্তি - বব হার্পার
দুটিই দুর্দান্ত বই যা আমি সবেমাত্র সুন্দর এবং সুস্পষ্টভাবে বিশদে বিশদ সম্পর্কে আরও কিছু কথা বলেছি এবং তা উপস্থাপন করে।