यदि आप टाइप- इनफरेंस के लिए एक स्वच्छ, कार्यात्मक संदर्भ की तलाश कर रहे हैं, तो मैं Gundry, McBride, और McKinna के 2010 के "आंशिक संदर्भ में टाइप इंफ़ेक्शन " के लिए थोड़ा आंशिक हूं , हालांकि यह किसी भी वास्तविक मौजूदा योग्यता के लिए एक अच्छा मार्गदर्शक नहीं हो सकता है। ।
मुझे लगता है कि उत्तर का एक हिस्सा यह है कि मूल्य प्रतिबंध से परे, वहाँ वास्तव में इतना मुश्किल नहीं है कि अनिवार्य भाषाओं के लिए हिंडले-मिलनर प्रकार का अनुमान लगाते हुए: यदि आप के 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) में डालता है ।
xx∀ α । रेफरी ( विकल्प ( α ) )xΛ α । रेफ [ α ] ( कोई नहीं )
यह सुझाव देगा कि पहले उदाहरण का एक "अच्छा" व्यवहार ठीक उसी तरह से व्यवहार करना है जिस तरह से दूसरा उदाहरण व्यवहार करता है - टाइप-स्तरीय लैम्ब्डा को दो अलग-अलग समयों पर पलटना। पहली बार जब हम तुरंत पलटा xकरते हैं int, तो x [int]यह एक संदर्भ सेल होल्डिंग का मूल्यांकन करने का कारण होगा NONEऔर फिर SOME 5। दूसरी बार हम दृष्टांत 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)। तो एक शोध प्रश्न के स्तर पर, क्या आप "कैमल / एसएमएल में विकसित तकनीकों को लागू करें, जिसमें मूल्य प्रतिबंध भी शामिल है" का उत्तर है?