काम पर मुझे एक गतिशील भाषा के बारे में कुछ प्रकार की जानकारी के साथ काम सौंपा गया है। मैं बयानों के अनुक्रमों को नेस्टेड let
अभिव्यक्तियों में फिर से लिखता हूं , जैसे:
return x; Z => x
var x; Z => let x = undefined in Z
x = y; Z => let x = y in Z
if x then T else F; Z => if x then { T; Z } else { F; Z }
चूंकि मैं सामान्य प्रकार की जानकारी से शुरू कर रहा हूं और अधिक विशिष्ट प्रकारों को कम करने की कोशिश कर रहा हूं, इसलिए प्राकृतिक विकल्प शोधन प्रकार है। उदाहरण के लिए, सशर्त ऑपरेटर अपनी वास्तविक और झूठी शाखाओं के प्रकारों का एक संघ लौटाता है। साधारण मामलों में, यह बहुत अच्छी तरह से काम करता है।
हालांकि, जब मैं निम्न प्रकार का अनुमान लगाने की कोशिश कर रहा था, तो मैं एक रोड़ा में भाग गया:
function g(f) {
var x;
x = f(3);
return f(x);
}
जिसे फिर से लिखा गया है:
\f.
let x = undefined in
let x = f 3 in
f x
मैं पहले से ही ओवरलोड +
ऑपरेटर के प्रकार को हल करने के लिए कार्यात्मक निर्भरता का उपयोग कर रहा हूं , इसलिए मुझे लगा कि यह एक स्वाभाविक पसंद है कि उन्हें f
भीतर के प्रकार को हल करने के लिए उपयोग किया जाए g
। अर्थात्, f
इसके सभी अनुप्रयोगों के प्रकार एक साथ विशिष्ट रूप से निर्धारित होते हैं g
। हालांकि, जैसा कि यह पता चला है, फंडेप्स खुद को बहुत अच्छी तरह से स्रोत प्रकारों की चर संख्याओं के लिए उधार नहीं देते हैं।
वैसे भी, बहुरूपता और शोधन टाइपिंग का अंतर समस्यात्मक है। तो क्या एक बेहतर तरीका है जो मुझे याद आ रहा है? मैं वर्तमान में "एमएल के लिए शोधन प्रकार" को पचा रहा हूं और अधिक साहित्य या अन्य बिंदुओं की सराहना करूंगा।