यदि आप टाइप- इनफरेंस के लिए एक स्वच्छ, कार्यात्मक संदर्भ की तलाश कर रहे हैं, तो मैं 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
) में डालता है ।
x
x
∀ α । रेफरी ( विकल्प ( α ) )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
)। तो एक शोध प्रश्न के स्तर पर, क्या आप "कैमल / एसएमएल में विकसित तकनीकों को लागू करें, जिसमें मूल्य प्रतिबंध भी शामिल है" का उत्तर है?