2012-10-24 19 views
12

टाइप रैकेट किस तरह का प्रकार अनुमान लगाता है? मैं रैकेट मेलिंग सूची पर निम्नलिखित स्निपेट नहीं मिली:टाइप किए गए रैकेट के प्रकार अनुमान कैसे काम करता है?

The Typed Racket type system contains a number of features that go beyond what's supported in Hindley/Milner style type systems, and so we can't use that inference system. Currently, Typed Racket uses local type inference to infer many of the types in your program, but we'd like to infer more of them -- this is an ongoing area of research.

blurb ऊपर शब्द "स्थानीय प्रकार निष्कर्ष" का उपयोग करता है, और मैं यह भी सुना है "घटना टाइपिंग" एक बहुत इस्तेमाल किया है, लेकिन मैं वास्तव में नहीं हूँ सुनिश्चित करें कि इन शर्तों का क्या अर्थ है।

ऐसा लगता है कि टाइप किए गए रैकेट वर्तमान में उपयोग किए जाने वाले टाइप अनुमान प्रणाली को अनावश्यक रूप से कमजोर है। मेरा मतलब क्या है इसका एक उदाहरण यहां दिया गया है। निम्न लिखें नहीं करता है की जाँच करें:

(struct: pt ([x : Real] [y : Real])) 

(define (midpoint p1 p2) 
    (pt (/ (+ (pt-x p1) (pt-x p2)) 2) 
     (/ (+ (pt-y p1) (pt-y p2)) 2))) 

आप स्पष्ट रूप से (: midpoint (pt pt -> pt)) साथ midpoint व्याख्या करने के लिए है, अन्यथा आप त्रुटि मिलती है: Type Checker: Expected pt, but got Any in: p1। टाइप चेकर इस प्रकार से निष्कर्ष निकाला नहीं जा सकता है कि p1 और p2pt होना चाहिए? क्या यह रैकेट प्रकारों को लागू करने के तरीके की एक मौलिक सीमा है (यानी रैकेट की अधिक उन्नत प्रकार की विशेषताओं के कारण, वास्तव में गलत तर्क की यह पंक्ति है), या यह कुछ ऐसा है जो संभवतः भविष्य में लागू किया जा सकता है?

+6

सैम टोबिन-Höchstadt की पीएचडी शोध प्रबंध रक्तमय विवरण होना चाहिए: http://www.ccs.neu.edu/racket/pubs/dissertation-tobin-hochstadt.pdf – dyoo

उत्तर

6

डिफ़ॉल्ट रूप से, अनन्य शीर्ष-स्तरीय फ़ंक्शंस को Any के इनपुट और आउटपुट प्रकार माना जाता है। मैं इस अस्पष्ट स्पष्टीकरण की पेशकश करता हूं: चूंकि रैकेट की प्रकार प्रणाली है इसलिए लचीला, यह कभी-कभी उन प्रकारों को अनुमानित कर सकता है जिन्हें आप उम्मीद नहीं करेंगे, और कुछ प्रोग्रामों को टाइपशेक करने की अनुमति दें जब आप उन्हें एक प्रकार की त्रुटि को छोड़ने के लिए पसंद कर सकते हैं।

टेंगेंट: यदि आप उपयुक्त हैं तो आप define: फॉर्म का भी उपयोग कर सकते हैं।

(define: (midpoint [p1 : pt] [p2 : pt]) : pt 
    ...) 
+1

इस जवाब को जोड़ना: मैं हूँ सप्ताह के किसी भी दिन "चालाक" पर "अच्छी तरह परिभाषित" लें। "चालाक" के साथ समस्या यह है कि एक प्रोग्रामर के रूप में, जल्दी या बाद में आप आसानी से सीमा के दूसरी तरफ चेक-इन और चेक-चेक करने योग्य के बीच हवा में जा रहे हैं, और आपको यह पता लगाना होगा कि अपना कोड कैसे बदलें कि चेकर इसे मान्य कर सकता है। इस तरह की स्थिति में, यह समझने की कोशिश कर रहा है कि किस चतुरता को अपील करने के लिए बहुत मुश्किल हो सकती है। –

+1

तो ऐसा लगता है कि वास्तव में एक मौलिक * सीमा * नहीं है - इसके बजाए, ऐसे प्रोग्रामों के बीच केवल यह अस्पष्ट ग्रे क्षेत्र है जो अच्छी तरह से टाइप किए गए हैं और प्रोग्राम नहीं हैं (और हो सकता है कि यह क्षेत्र टाइप किए गए रैकेट में अन्य प्रकार की तुलना में बड़ा हो सिस्टम, चूंकि रैकेट सिस्टम इतना लचीला है)। जिन लोगों ने टाइप किए गए रैकेट के अनुमान को डिजाइन किया है, वे बस उस सीमा से जितना संभव हो उतना दूर रहे: केवल कुछ ही, अच्छी तरह से परिभाषित मामले हैं जहां टाइप अनुमान हो सकता है, और बाकी सब कुछ स्पष्ट रूप से घोषित किया जाना चाहिए। इस तरह, वे एक उलझन में गड़बड़ में आने से बचें। क्या यह सही है? – Ord

+0

@ ओर्ड यह सही है। आप विवरण के लिए सैम के शोध प्रबंध को पढ़ सकते हैं। वह इस प्रश्न के लिए इसके एक खंड को भी समर्पित करता है: धारा 3.2। –