मैं मानक एमएल में मूल्य प्रतिबंध के बारे में थोड़ा सा पढ़ रहा था और यह देखने के लिए ओकैमल को उदाहरण का अनुवाद करने की कोशिश की कि यह क्या करेगा। ऐसा लगता है जैसे ओकैमल इन प्रकारों को संदर्भों में उत्पन्न करता है जहां एसएमएल मूल्य प्रतिबंध के कारण एक प्रोग्राम को अस्वीकार कर देगा। मैंने उन्हें अन्य संदर्भों में भी देखा है जैसे रिक्त हैश टेबल जो अभी तक किसी विशेष प्रकार के "विशेष" नहीं हैं।ओकैमल 'अंडरस्कोर प्रकार' (उदा। '_ ए) रनटाइम प्रकार त्रुटियों/ध्वनिता उल्लंघनों की संभावना का परिचय देते हैं?
http://mlton.org/ValueRestriction
यहाँ एसएमएल में एक को अस्वीकार कर दिया कार्यक्रम का एक उदाहरण है:
val r: 'a option ref = ref NONE
val r1: string option ref = r
val r2: int option ref = r
val() = r1 := SOME "foo"
val v: int = valOf (!r2)
आप न्यू जर्सी के एसएमएल में शब्दशः पहली पंक्ति दर्ज करते हैं Repl आप प्राप्त निम्न त्रुटि:
- val r: 'a option ref = ref NONE;
stdIn:1.6-1.33 Error: explicit type variable cannot be generalized at its binding declaration: 'a
यदि आप स्पष्ट प्रकार की एनोटेशन छोड़ देते हैं तो आपको
मिलता है- val r = ref NONE
stdIn:1.6-1.18 Warning: type vars not generalized because of
value restriction are instantiated to dummy types (X1,X2,...)
val r = ref NONE : ?.X1 option ref
यह डमी प्रकार वास्तव में क्या है? ऐसा लगता है यह पूरी तरह से दुर्गम है जैसे और, कुछ भी
- r := SOME 5;
stdIn:1.2-1.13 Error: operator and operand don't agree [overload conflict]
operator domain: ?.X1 option ref * ?.X1 option
operand: ?.X1 option ref * [int ty] option
in expression:
r := SOME 5
OCaml में साथ एकजुट करने के लिए इसके विपरीत द्वारा विफल रहता है, डमी प्रकार चर सुलभ है और पहली बात यह कर सकते हैं के साथ सम्मिलित है।
# let r : 'a option ref = ref None;;
val r : '_a option ref = {contents = None}
# r := Some 5;;
- : unit =()
# r ;;
- : int option ref = {contents = Some 5}
यह भ्रमित करने और कुछ प्रश्न उठाता है।
1) क्या एक अनुरूप एसएमएल कार्यान्वयन "डमी" प्रकार को सुलभ बनाने के लिए चुन सकता है?
2) ओकैमल मूल्य प्रतिबंध के बिना ध्वनि कैसे बनाए रखता है? क्या यह एसएमएल की तुलना में कमजोर गारंटी देता है?
3) '_a option ref
'a option ref
से कम polymorphic लगता है। OCaml में let r : 'a option ref = ref None;;
(एक स्पष्ट एनोटेशन के साथ) क्यों खारिज नहीं किया गया है?
बहुत अच्छा जवाब देने के लिए इस पुनर्लेखन के लिए की है। लगभग 3), 'लेट आर' लिखना, एक विकल्प रेफरी 'आर' के एकीकरण को 'विकल्प विकल्प' के साथ एकीकरण को मजबूर करता है, इसलिए कुछ भी नहीं कर रहा है। – PatJ