নির্ভরশীল টাইপ করা হবে না কেন?


161

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

মূলত দুটি জিনিস আমি জানতে চাই। প্রথমটি হ'ল, একেবারে সরলভাবে, "নির্ভরশীল-টাইপযুক্ত ভাষা হওয়া" এর অর্থ কী ? (আশা করি এটি সম্পর্কে খুব প্রযুক্তিগত না হয়ে।)

দ্বিতীয় প্রশ্ন হ'ল ... এর অপূর্ণতা কী? আমার অর্থ, লোকেরা জানে যে আমরা সেই পথে চলেছি, সুতরাং এর কিছুটা সুবিধা থাকতে হবে must এবং তবুও, আমরা এখনও সেখানে নেই, সুতরাং অবশ্যই কিছুটা লোকচলা বন্ধ করে দেওয়া উচিত লোকদের সমস্ত পথে যেতে। আমি ধারণাটি পেয়েছি যে সমস্যাটি জটিলতার এক খাড়া বৃদ্ধি। তবে, নির্ভরশীল টাইপিং কী তা সত্যই বুঝতে পারছি না, আমি নিশ্চিতভাবে জানি না।

আমি যা জানি তা হ'ল আমি যখনই নির্ভরশীল-টাইপযুক্ত প্রোগ্রামিং ভাষাটি পড়তে শুরু করি তখন পাঠ্যটি পুরোপুরি বোধগম্য হয় ... সম্ভবত সমস্যাটি তাই। (?)


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

27
@ জিএমনিকজি: টাইপ চেকিং পুরোপুরি সম্ভব। প্রকার অনুমান অন্য জিনিস, তবে আবার জিএইচসি-র বিভিন্ন প্রসারগুলি সমস্ত ধরণের অনুমান করা সম্ভব হওয়া উচিত এই ধারণাটি দীর্ঘদিন ধরে ত্যাগ করে।
সিএ ম্যাকক্যান

7
আমি যদি সঠিকভাবে বুঝতে পারি, তবে ত্রুটিটি হ'ল নির্ভর করে টাইপ করা সঠিকভাবে করা (যেমন, এমনভাবে যা ব্যবহারযোগ্য এবং সুপ্রতিষ্ঠিত উভয়ই) শক্ত , এবং আমরা জানি না এখনও কতটা কার্যকর।
আসন্ন ঝড়

1
@ ক্যাম্যাকক্যান: হ্যাঁ, আমার ভুল
GManNickG

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

উত্তর:


21

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

সম্পাদনা: স্পষ্টতই, এই দিক থেকে, আমি ভুল ছিলাম (@ পিগওয়ার্কারের মন্তব্য দেখুন)। আমি এগুলির বাকি অংশগুলি পুরাণকাহিনী খাওয়ানোর রেকর্ড হিসাবে সংরক্ষণ করব। : P: P


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

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


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

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

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

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

2
@ পিগওয়ার্কার কি হাস্কেলের মোট পরিষ্কার কি সাবসেট আছে? যদি তাই হয়, আমরা কেবল "ভাষা এবং টুকরা স্তর উভয়ই থাকতে পারে" ভাষা টুকরা জন্য এটি ব্যবহার করতে পারি না? যদি না হয়, এটি একটি উত্পাদন করতে কি লাগে?
18-25-200t ptharien এর শিখা

223

নির্ভরশীল টাইপ করা হাস্কেল, এখন?

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

সাধারণ ডেটাটাইপগুলি ধরণের স্তরে উন্নীত হয়, যাতে তাদের থাকা মানগুলি ধরণের ক্ষেত্রে ব্যবহার করা যায়। সুতরাং প্রত্নতাত্ত্বিক উদাহরণ

data Nat = Z | S Nat

data Vec :: Nat -> * -> * where
  VNil   :: Vec Z x
  VCons  :: x -> Vec n x -> Vec (S n) x

সম্ভব হয়ে ওঠে এবং এর সাথে সংজ্ঞা যেমন

vApply :: Vec n (s -> t) -> Vec n s -> Vec n t
vApply VNil         VNil         = VNil
vApply (VCons f fs) (VCons s ss) = VCons (f s) (vApply fs ss)

যা সুন্দর. নোট করুন যে দৈর্ঘ্যটি nসেই ফাংশনে একটি খাঁটি স্থিতিশীল জিনিস, এটি নিশ্চিত করে যে ইনপুট এবং আউটপুট ভেক্টরগুলির একই দৈর্ঘ্য রয়েছে, যদিও সেই দৈর্ঘ্য কার্যকর করার ক্ষেত্রে কোনও ভূমিকা পালন করে না vApply। বিপরীতে এটা অনেক, trickier (অর্থাত, অসম্ভব) ফাংশন যার ফলে বাস্তবায়ন করার nএকটি প্রদত্ত কপি x(হবে যা pureকরার vApplys 'এর <*>)

vReplicate :: x -> Vec n x

কারণ রান-টাইমে কয়টি অনুলিপি করা জেনে রাখা গুরুত্বপূর্ণ। সিলেটলেট প্রবেশ করান।

data Natty :: Nat -> * where
  Zy :: Natty Z
  Sy :: Natty n -> Natty (S n)

যে কোনও প্রচারযোগ্য প্রকারের জন্য, আমরা সিঙ্গেলটন পরিবার তৈরি করতে পারি, প্রচারিত ধরণের উপরে সূচিযুক্ত, এর মানগুলির রান-টাইম ডুপ্লিকেট দ্বারা বাস করা। Natty nটাইপ-লেভেলের রান-টাইম কপিগুলির ধরণ n :: Nat। আমরা এখন লিখতে পারি

vReplicate :: Natty n -> x -> Vec n x
vReplicate Zy     x = VNil
vReplicate (Sy n) x = VCons x (vReplicate n x)

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

কি বাজে? কি অনুপস্থিত?

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

class Nattily (n :: Nat) where
  natty :: Natty n
instance Nattily Z where
  natty = Zy
instance Nattily n => Nattily (S n) where
  natty = Sy natty

আমাদের লিখতে দেয়, বলে,

instance Nattily n => Applicative (Vec n) where
  pure = vReplicate natty
  (<*>) = vApply

এটি কাজ করে, তবে এর অর্থ এখন আমাদের আসল Natপ্রকারের তিনটি অনুলিপি তৈরি হয়েছে: এক ধরণের, একক পরিবার এবং একটি সিঙ্গলটন শ্রেণি। সুস্পষ্ট Natty nমান এবং Nattily nঅভিধানের আদান-প্রদানের জন্য আমাদের কাছে একটি বিস্তৃত প্রক্রিয়া রয়েছে । তদুপরি, Nattyএটি নয় Nat: রান-টাইম মানগুলির উপর আমাদের একরকম নির্ভরতা রয়েছে, তবে আমরা প্রথমে যে ধরণের ভেবেছিলাম তা নয়। পুরোপুরি নির্ভরশীলভাবে টাইপ করা কোনও ভাষা নির্ভরশীল টাইপগুলিকে এই জটিল করে তোলে না!

এদিকে Natপদোন্নতি দেওয়া হলেও করা Vecযায় না। আপনি কোনও সূচিকৃত প্রকার অনুসারে সূচী করতে পারবেন না। নির্ভরশীল টাইপ করা ভাষাগুলিতে সম্পূর্ণ এ জাতীয় কোনও বিধিনিষেধ আরোপ করে না, এবং নির্ভরশীল টাইপযুক্ত শো-অফ হিসাবে আমার কেরিয়ারে আমি আমার আলোচনায় দ্বি-স্তর সূচকের উদাহরণ অন্তর্ভুক্ত করতে শিখেছি, কেবলমাত্র একটি স্তরকে সূচি তৈরিকারী লোকদের শেখাতে কঠিন-তবে-সম্ভাবনা আমাকে কার্ডের ঘরের মতো ভাঁজ করার আশা করবেন না। সমস্যা কি? সমতা। জিএডিডিগুলি যখন আপনি কোনও নির্মাতাকে একটি নির্দিষ্ট রিটার্নাল টাইপকে সুস্পষ্ট সমীকরণীয় দাবীতে রূপান্তর করেন তখন আপনি স্পষ্টভাবে অর্জন করেন এমন বাধাগুলি অনুবাদ করে কাজ করে। এটার মত.

data Vec (n :: Nat) (x :: *)
  = n ~ Z => VNil
  | forall m. n ~ S m => VCons x (Vec m x)

আমাদের দুটি সমীকরণের প্রতিটি ক্ষেত্রে উভয় পক্ষের সদয় থাকে Nat

এখন ভেক্টরগুলির উপর সূচকযুক্ত কোনও কিছুর জন্য একই অনুবাদ চেষ্টা করুন।

data InVec :: x -> Vec n x -> * where
  Here :: InVec z (VCons z zs)
  After :: InVec z ys -> InVec z (VCons y ys)

হয়ে

data InVec (a :: x) (as :: Vec n x)
  = forall m z (zs :: Vec x m). (n ~ S m, as ~ VCons z zs) => Here
  | forall m y z (ys :: Vec x m). (n ~ S m, as ~ VCons y ys) => After (InVec z ys)

এবং এখন আমরা মধ্যে equational সীমাবদ্ধতার গঠন as :: Vec n xএবং VCons z zs :: Vec (S m) xযেখানে দুই পক্ষের চিহ্নগুলি সিন্টেক্সের স্বতন্ত্র (কিন্তু provably সমান) ধরণের আছে। জিএইচসি কোর বর্তমানে এই জাতীয় ধারণার জন্য সজ্জিত নয়!

আর কি অনুপস্থিত? ঠিক আছে, বেশিরভাগ হাস্কেল টাইপ স্তরটি থেকে অনুপস্থিত। আপনি যে পদগুলির প্রচার করতে পারেন তার ভাষাতে কেবল ভেরিয়েবল এবং নন-জিএডিডি কনস্ট্রাক্টর রয়েছে। একবার আপনার কাছে type familyএলে , যন্ত্রপাতি আপনাকে টাইপ-লেভেল প্রোগ্রামগুলি লেখার অনুমতি দেয়: এগুলির মধ্যে কয়েকটি পুরোপুরি ফাংশনের মতো হতে পারে যা আপনি শব্দ পর্যায়ে লেখাকে বিবেচনা করবেন (উদাহরণস্বরূপ, Natসংযোজন সহ সজ্জিত , যাতে আপনি সংযোজন করার জন্য একটি ভাল টাইপ দিতে পারেন Vec) তবে এটি কেবল কাকতালীয় ঘটনা!

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

টাইপ-লেভেল প্রোগ্রাম চলমান

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

নির্ভরযোগ্যভাবে টাইপ করা ভাষা, মোট, টাইপচেকারকে দীর্ঘ প্রতীক্ষার চেয়ে খারাপ কিছু না হওয়ার আশঙ্কায় প্রোগ্রামগুলি চালনার অনুমতি দেয়। হাস্কেল আরও নির্ভরশীলভাবে টাইপ হওয়ার সাথে সাথে আমরা তার স্ট্যাটিক এক্সিকিউশন মডেলটি কী হওয়া উচিত এই প্রশ্নের মুখোমুখি হই? একটি পদ্ধতি হ'ল স্থির সম্পাদন মোট ফাংশনগুলিতে সীমাবদ্ধ করা, যা আমাদের একই স্বাধীনতা চালানোর অনুমতি দেয়, তবে আমাদের ডাটা এবং কোডাটার মধ্যে পার্থক্য (কমপক্ষে টাইপ-লেভেল কোডের জন্য) তৈরি করতে বাধ্য করতে পারে, যাতে আমরা বলতে পারি যে কিনা সমাপ্তি বা উত্পাদনশীলতা প্রয়োগ করুন। তবে এটাই একমাত্র পন্থা নয়। আমরা অনেক দুর্বল কার্যকর সম্পাদন মডেল বাছাই করতে পারছি যা প্রোগ্রামগুলি চালাতে অনিচ্ছুক, কম সমীকরণ তৈরি করার ব্যয়ে কেবল গণনা দ্বারা প্রকাশিত হবে। এবং বাস্তবে, জিএইচসি আসলে এটিই করে। জিএইচসি কোরের জন্য টাইপিং বিধিগুলি চলমান সম্পর্কে কোনও উল্লেখ করে না প্রোগ্রাম, কিন্তু শুধুমাত্র সমীকরণের জন্য প্রমাণ পরীক্ষা করার জন্য। মূলটিতে অনুবাদ করার সময়, জিএইচসি-র সীমাবদ্ধ সমাধানকারী আপনার টাইপ-লেভেল প্রোগ্রামগুলি চালানোর চেষ্টা করে, প্রমাণের একটি সামান্য রৌপ্য ট্রেইল তৈরি করে যে প্রদত্ত প্রকাশটি তার স্বাভাবিক ফর্মের সমান। প্রমাণ-প্রজন্মের এই পদ্ধতিটি কিছুটা অপ্রত্যাশিত এবং অনিবার্যভাবে অসম্পূর্ণ: উদাহরণস্বরূপ, এটি ভীতিকর চেহারার পুনরাবৃত্তিগুলির সাথে লজ্জিত হয় এবং সম্ভবত এটি বুদ্ধিমান। IO যে বিষয়টির জন্য আমাদের উদ্বিগ্ন হওয়ার দরকার নেই তা হ'ল টাইপচেকারের গণনা সম্পাদন : মনে রাখবেন যে launchMissilesরান-টাইম সিস্টেমের মতো টাইপচেকারকে একই অর্থ দিতে হবে না!

হিন্দি-মিলনার সংস্কৃতি

দুর্ভাগ্যজনক সাংস্কৃতিক পার্শ্ব-প্রতিক্রিয়া সহ হিন্ডলি-মিলনার টাইপ সিস্টেমটি চারটি স্বতন্ত্র পার্থক্যের সত্যই বিস্ময়কর কাকতালীয়তা অর্জন করে যে অনেক লোক এই পার্থক্যের মধ্যে পার্থক্য দেখতে পায় না এবং এটি কাকতালীয় ঘটনাটি অনিবার্য বলে ধরে নিতে পারে! আমি কি সম্পর্কে কথা বলছি?

  • পদ বনাম প্রকার
  • স্পষ্টত লিখিত জিনিস বনাম স্পষ্টত লিখিত জিনিস
  • রান- টাইমের আগে রান-টাইম বনাম মুছে ফেলা উপস্থিতি
  • নির্ভরশীল বিমূর্তকরণ বনাম নির্ভরশীল বিমূর্ততা

আমরা শর্তাবলী লিখতে অভ্যস্ত এবং অনুমান করা প্রকারের প্রস্থান ... এবং তারপরে মুছে ফেলা। আমরা অনুরূপ প্রকার বিমূর্ততা এবং অ্যাপ্লিকেশনটি নিঃশব্দে এবং স্থিতিশীলভাবে সংঘটিত হওয়ার সাথে প্রকারের ভেরিয়েবলগুলির পরিমাণ নির্ধারণ করতে অভ্যস্ত।

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

আমাদের কোন ভাষার নকশার পছন্দগুলি পর্যালোচনা করা উচিত কারণ এই সংযুক্তাগুলি আর রাখে না? উদাহরণস্বরূপ, এটি কি ঠিক যে হাস্কেল forall x. tস্পষ্টভাবে কোনও পরিমাণকে ত্বরান্বিত করার কোনও উপায় সরবরাহ করে না ? টাইপচেকার একত্রীকরণের মাধ্যমে অনুমান করতে না xপারলে tআমাদের কী xহবে তা বলার আর কোনও উপায় নেই ।

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

হাস্কেলের জন্য পরবর্তী পদক্ষেপ

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

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

আমাদের একটি নির্ভরশীল ফাংশন প্রকার, প্রবর্তন করে সিঙ্গলটন নির্মাণের প্রয়োজনীয়তা বাদ দেওয়া উচিত pi x :: s -> t। এ জাতীয় ধরণের একটি ফাংশন স্পষ্টভাবে প্রয়োগ করতে পারে কোনও প্রকারের মত প্রকাশের ক্ষেত্রে sযা টাইপ এবং শব্দভাষার সংযোগস্থলে বাস করে (সুতরাং, ভেরিয়েবল, কনস্ট্রাক্টর, আরও অনেক কিছু পরে আসবে)। সংশ্লিষ্ট লাম্বদা এবং অ্যাপ্লিকেশন রান-টাইমে মুছে ফেলা হবে না, তাই আমরা লিখতে সক্ষম হব

vReplicate :: pi n :: Nat -> x -> Vec n x
vReplicate Z     x = VNil
vReplicate (S n) x = VCons x (vReplicate n x)

Natদ্বারা প্রতিস্থাপন ছাড়া Natty। এর ডোমেনটি piযে কোনও প্রচারমূলক প্রকার হতে পারে, তাই যদি জিএডিডিগুলি প্রচার করা যায় তবে আমরা নির্ভরশীল কোয়ানটিফায়ার সিকোয়েন্সগুলি লিখতে পারি (বা "ডেইলিউইজন তাদের" টেলিস্কোপস "বলেছিল)

pi n :: Nat -> pi xs :: Vec n x -> ...

আমাদের যে দৈর্ঘ্যের প্রয়োজন to

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

খুব কঠিন?

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

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

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

তবুও হাসেলকে কেন বিরক্ত করবেন?

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


6
আমি এখনও ডেটা কিন্ডস স্টাফ সম্পর্কে যত্নশীল না। কারণ বেশিরভাগ আমি ভালো কিছু কাজ করতে চান: fmap read getLine >>= \n -> vReplicate n 0। আপনি যেমন লক্ষ্য করেছেন, Nattyএটি থেকে এক পথ দূরে। তদ্ব্যতীত, ভিআরপ্লিকেটটি কোনও আসল মেমরি অ্যারেতে অনুবাদযোগ্য হওয়া উচিত, এমন কিছু newtype SVector n x = SVector (Data.Vector.Vector x), যেখানে nধরনের Nat(বা অনুরূপ) রয়েছে। "নির্ভরশীল টাইপযুক্ত শো-অফ" এর জন্য সম্ভবত আর একটি বিক্ষোভ পয়েন্ট?
জন এল

7
আপনি কি বলতে পারেন প্রভাবগুলির সাথে প্রোগ্রামিংয়ের আদর্শ চিকিত্সার জন্য আপনার মনে যা আছে?
স্টিভেন শ

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

4
@ পিগ ওয়ার্কার আপনি "কোনও পর্বের পার্থক্য নেই" রূপকথার হিসাবে গ্রহণ করেন (অন্যরাও যেগুলির সাথে আমি সম্মত তা পৌরাণিক কাহিনী)। তবে আপনি এটি কাগজপত্র এবং আলোচনায় দেখেছি, এবং এর মধ্যে অন্য একজনকে আমি শ্রদ্ধা করে বলে "নির্ভরশীল ধরণের তত্ত্বটি একটি সাধারণ সংকলক থেকে আলাদা কারণ আমরা প্রকারের চেকিং, সংকলন এবং কার্যকরকরণের পর্যায়গুলি অর্থপূর্ণভাবে পৃথক করতে পারি না। " (আন্ড্রেজ এর সর্বশেষ পোস্টটি নভে 8 2012 দেখুন) আমার অভিজ্ঞতায় "এটি নকল করা" কখনও কখনও আমরা কমপক্ষে পর্বের পার্থক্যটি ঝাপসা করি যদিও এটি মুছে ফেলার দরকার নেই। আপনি যদি এখানে না থাকেন তবে অন্যথায় অন্যথায় এই সমস্যাটি প্রসারিত করতে পারবেন?
sclv

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

20

জন হ'ল নির্ভরশীল প্রকারগুলি সম্পর্কে আর একটি সাধারণ ভুল ধারণা: যে কেবলমাত্র রান-টাইমে ডেটা পাওয়া গেলে তারা কাজ করে না। আপনি কীভাবে getLine উদাহরণটি করতে পারেন তা এখানে:

data Some :: (k -> *) -> * where
  Like :: p x -> Some p

fromInt :: Int -> Some Natty
fromInt 0 = Like Zy
fromInt n = case fromInt (n - 1) of
  Like n -> Like (Sy n)

withZeroes :: (forall n. Vec n Int -> IO a) -> IO a
withZeroes k = do
  Like n <- fmap (fromInt . read) getLine
  k (vReplicate n 0)

*Main> withZeroes print
5
VCons 0 (VCons 0 (VCons 0 (VCons 0 (VCons 0 VNil))))

সম্পাদনা: এইচএম, এটি পিগ ওয়ার্কারের উত্তরের মন্তব্য বলে মনে করা হয়েছিল। আমি স্পষ্টভাবে এসও এ ব্যর্থ।


আপনার প্রথম বাক্যটি কিছুটা অদ্ভুত বলে মনে হচ্ছে; আমি বলতে হবে নির্ভরশীল ধরনের বিন্দু যে তারা হয় না কাজ ডেটা রান সময়ে শুধুমাত্র উপলব্ধ। তবে এই সিপিএস-স্টাইলের কৌশলটি এক নয়। ধরুন আপনার কোনও ফাংশন আছে Vec Zy -> IO String। আপনি এটির সাথে এটি ব্যবহার করতে পারবেন না withZeroes, কারণ প্রকারটি Zyফোরাল এন দিয়ে একত্রিত করা যায় না। এক বা দুটি বিশেষ ক্ষেত্রে আপনি এটিকে ঘিরে কাজ করতে পারেন তবে এটি দ্রুত হাতছাড়া হয়ে যায়।
জন এল

একটি সহজ টাইপ করা মান (গেটলাইন থেকে স্ট্রিংয়ের মতো) গ্রহণ এবং এটিকে শক্তিশালী প্রকারের সাথে (উপরে একটি নেটি এন এর মতো) রূপান্তর করার সময় মূল কীটি হ'ল যে আপনি প্রয়োজনীয় গতিশীল পরীক্ষাগুলি করছেন তা টাইপ চেকারকে বোঝাতে হবে। আপনার উদাহরণে আপনি একটি স্বেচ্ছাসেবী সংখ্যা পড়ছেন যাতে forall nবোধগম্য হয়। আরও সুনির্দিষ্ট সীমাবদ্ধতা একইভাবে প্রয়োগ করা যেতে পারে। আপনার কাছে কি এর থেকে আরও ভাল উদাহরণ রয়েছে Vec Zy(প্রোগ্রামটির এখনও 0 টির পরিবর্তে 5 টি ব্যবহারকারীকে ইনপুটিং পরিচালনা করতে হবে)?
ulfnorell

1
প্রথম বাক্যটি দিয়ে আমি যা বলতে চাইছিলাম তা হ'ল আমি মাঝে মধ্যে এমন লোকদের মধ্যে ছড়িয়ে পড়ি যারা বিশ্বাস করে যে আপনি যদি বাইরের বিশ্বের সাথে যোগাযোগের মাধ্যমে আপনার ডেটা পান তবে আপনি নির্ভরশীল প্রকারগুলি ব্যবহার করতে পারবেন না। আমার বক্তব্যটি হ'ল আপনাকে কেবলমাত্র একটি নির্ভরশীল টাইপ করা পার্সার লিখতে হবে যা সাধারণত সোজা-এগিয়ে।
ulfnorell

1
ulfnorell: দুঃখিত, আমি পরিষ্কার ছিল না। ধরুন আপনার একটি ফাংশন রয়েছে যা এর সাথে কাজ করবে Vec Zy -> IO Stringএবং অন্যটি কাজ করবে এবং Vec n -> IO Stringটাইপটি মেলে তবেই আপনি প্রথমটি ব্যবহার করতে চান। হ্যাঁ এটি সম্ভব, তবে এটি সক্ষম করার পদ্ধতিগুলি আঠালো। এবং এটি খুব সাধারণ যুক্তিযুক্ত; আপনার আরও জটিল যুক্তি থাকলে এটি আরও খারাপ। এছাড়াও, আপনাকে সিপিএসে প্রচুর কোড পুনরায় লেখার প্রয়োজন হতে পারে। এবং আপনার কাছে এখনও কোনও ধরণের-স্তরের প্রকাশ নেই যা মান স্তরের একটি শর্তের উপর নির্ভরশীল
জন এল

আহ, আমি যা বলছি তা আমি দেখতে পাচ্ছি। এটি নেটিটি হ'ল ভিআরপ্লিকেটের মতো যেখানে আমরা এন এর উপর নির্ভর করে বিভিন্ন জিনিস করি। প্রকৃতপক্ষে এটি একটি সামান্য clunky পেতে পারেন। সিপিএস শৈলী একটি বিকল্প আপ বস্তাবন্দী existentials সঙ্গে কাজ করা: zeroes :: IO (Some (Flip Vec Int))
ulpnorell

19

পিগ ওয়ার্কার আমাদের উপর নির্ভরশীল ধরণের দিকে কেন যেতে হবে তার একটি দুর্দান্ত আলোচনা দেয় : (ক) তারা দুর্দান্ত; (খ) তারা আসলে হাস্কেল ইতিমধ্যে যা করে তা অনেক সহজ করে দেবে।

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

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.