আপনি যদি টাইপ-ইনফারেন্সের জন্য একটি ঝরঝরে, কার্যকরী রেফারেন্সের সন্ধান করেন তবে আমি গুন্ড্রি, ম্যাকব্রাইড, এবং ম্যাককিনার 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
:)। সুতরাং একটি গবেষণামূলক প্রশ্নের স্তরে, আপনি যে উত্তরটি সন্ধান করছেন "মান সীমাবদ্ধতা সহ ক্যামেল / এসএমএল তৈরি কৌশলগুলি প্রয়োগ করুন"?