আপনি যদি টাইপ-ইনফারেন্সের জন্য একটি ঝরঝরে, কার্যকরী রেফারেন্সের সন্ধান করেন তবে আমি গুন্ড্রি, ম্যাকব্রাইড, এবং ম্যাককিনার 2010 " প্রসঙ্গে প্রবন্ধের প্রকারের অনুকরণ " এর পক্ষে কিছুটা আংশিক , যদিও এটি প্রকৃত বিদ্যমান বাস্তবায়নের জন্য ভাল গাইড নাও হতে পারে ।
আমি মনে করি উত্তর অংশ, মান সীমাবদ্ধতা বহুদূরে, সত্যিই যে অনেক অসুবিধা অভিযোজিত অনুজ্ঞাসূচক ভাষায় Hindley-মিলনার টাইপ অনুমান নয়: যদি আপনার সংজ্ঞায়িত e1; e2জন্য অন্বিত চিনি যেমন (fn _ => e2) e1এবং সংজ্ঞায়িত while e1 do e2জন্য অন্বিত চিনি যেমন whiledo e1 (fn () => e2), যেখানে whiledoনিয়মিত হয় পুনরাবৃত্তি ফাংশন
fun whiledo g f = if g then (f (); whiledo g f) else ();
তারপরে টাইপ ইনফারেন্স সহ সবকিছু ঠিকঠাক কাজ করবে ।
মান সীমাবদ্ধতা একটি বিশেষ কৌশল হিসাবে, আমি নীচের গল্পটি পছন্দ করি; আমি নিশ্চিত যে আমি এটি কার্ল কেরি থেকে তুলেছি। নিম্নলিখিত কোডটি বিবেচনা করুন, যা মান সীমাবদ্ধতা আপনাকে এমএল-এ লেখা থেকে বিরত রাখবে:
let
val x: 'a option ref = ref NONE
in
(x := SOME 5; x := SOME "Hello")
end
এটি নিম্নলিখিত কোডের সাথে তুলনা করুন, যা সম্পূর্ণ অপ্রয়োজনীয়:
let
val x: unit -> 'a option ref = fn () => ref NONE
in
(x () := SOME 5; x () := SOME "Hello")
end
আমরা জানি যে দ্বিতীয় উদাহরণটি কী করে: এটি দুটি নতুন রেফ কোষযুক্ত তৈরি করে NONE, তারপরে SOME 5প্রথমটিকে একটি (এ int option ref) রাখে, তারপরে SOME "Hello"দ্বিতীয়টিতে রাখে (ক string option ref)।
তবে আমরা কীভাবে xসিস্টেম এফ (পলিমারফিক ল্যাম্বডা-ক্যালকুলাস) উপস্থাপন করব তার দিক দিয়ে প্রথম উদাহরণটি সম্পর্কে ভাবেন । এই ধরনের সেটিং-এ, x" " টাইপের মান হবে , সুতরাং এর অর্থ এই যে, একটি শব্দ হিসাবে, এর মান অবশ্যই একটি হতে হবে (প্রকার) : " "।Λ α । রেফ [ α ] (কোন নয় )∀α.ref(option(α))xΛα.ref[α](NONE)
এটি সূচিত করবে যে প্রথম উদাহরণের একটি "ভাল" আচরণ হ'ল দ্বিতীয় উদাহরণটির ঠিক একইরকম আচরণ করা - টাইপ-লেভেল ল্যাম্বডাকে দুটি ভিন্ন সময় ইনস্ট্যান্ট করুন। আমরা প্রথমবারের xসাথে ইনস্ট্যান্ট intকরব, যার ফলে x [int]একটি রেফারেন্স সেল হোল্ডিংয়ের মূল্যায়ন হবে NONEএবং তারপরে SOME 5। দ্বিতীয় সময় আমরা instantiate xসঙ্গে string, যে ক্ষেত্রে হবে x [string]একটি (থেকে নির্ণয় করা আলাদা! ) রেফারেন্স সেল হোল্ডিং NONEএবং তারপর SOME "Hello"। এই আচরণটি "সঠিক" (টাইপ-নিরাপদ), তবে কোনও প্রোগ্রামার প্রত্যাশা করবে এটি অবশ্যই নয়, এবং এই অপ্রত্যাশিত আচরণের সাথে প্রোগ্রামারদের এড়াতে আমাদের এমএল-তে মান সীমাবদ্ধতা রয়েছে।
let val x = ref 9 in while !x>0 do (print (Int.toString (!x)); x := !x-1) end:)। সুতরাং একটি গবেষণামূলক প্রশ্নের স্তরে, আপনি যে উত্তরটি সন্ধান করছেন "মান সীমাবদ্ধতা সহ ক্যামেল / এসএমএল তৈরি কৌশলগুলি প্রয়োগ করুন"?