मैं Typed रैकेट में निम्नलिखित कार्य के लिए प्रकार एनोटेशन परिभाषित करने के लिए कोशिश कर रहा हूँ: एक त्रुटि का उत्पादनफ़ंक्शन रैप में EOF -> झूठी, ए -> ए ∀ ए ≠ ईओएफ का प्रतिनिधित्व करना?
(Any -> Any)
इस प्रकार का उपयोग करना::
(define (neof x)
(if (eof-object? x) #f x))
यह अन-एनोटेट छोड़कर प्रकार देता है
(: neof (All (A) (case->
(EOF -> False)
(A -> A : #:+ (! EOF))))
expected: A
given: False
in: #f
यह संभवतः है क्योंकि कोई A = EOF
दे सकता है और फिर हमें EOF -> EOF
मिल सकता है।
प्रकार (: neof (All (A) A -> (U A False) #:- (U EOF False)))
, जबकि के रूप में स्पष्ट नहीं ऊपर के रूप में, यह भी त्रुटियों देता है:
mismatch in filter
expected: (Top | Bot)
given: ((! (U False EOF) @ x) | ((U False EOF) @ x))
in: (if (eof-object? x) #f x)
मेरा लक्ष्य एक समारोह जो मैं एक बंदरगाह से किसी भी उत्पादन के लिए आवेदन कर सकता है के लिए था एक या तो False
या बंदरगाह से मूल्य। अब मैं इसकी आवश्यकता पर पुनर्विचार कर रहा हूं, क्योंकि मैंने इस प्रकार को समझने की कोशिश करने में बहुत अधिक समय उड़ाया है। ।
(define/match (neof x)
[((? eof-object?)) #f]
[((? (compose not eof-object?))) x])
(इसके अलावा दूसरी पद्धति से किया जा रहा _
, लेकिन उस प्रकार की जानकारी का एक ही राशि एन्कोड नहीं करता साथ इस बिंदु मैं पर:
पूर्णता के लिए, मैं भी neof
की इस परिभाषा की कोशिश की किसी भी चीज़ से प्रकार चेकर को खुश करने की कोशिश कर रहा है)।
तो: मैं neof
के प्रकार का प्रतिनिधित्व कैसे कर सकता हूं?
आपका उत्तर अच्छा लग रहा था, इसलिए मैं वास्तव में आशावादी था। दुर्भाग्यवश, यह परिणाम है: 'टाइप चेकर: टाइप मिस्चैच; फ़िल्टर में मिलान में अपेक्षित: ((!! ईओएफ @ एक्स) | बॉट) \ n दिया गया: ((! (यू झूठी ईओएफ) @ एक्स) | ((यू झूठी ईओएफ) @ एक्स)) \ n इन: (अगर (eof-object? x) #fx) ' (\ n मेरे द्वारा जोड़ा गया है, वे नई लाइनें हैं जिनके पास टिप्पणियां नहीं हो सकती हैं।>> –
@JDavidSmith हम्म, आप सही हैं, यह टाइपशेक नहीं है रैकेट 6.1.1 पर मेरे लिए टाइपेड रैकेट वर्तमान में बहुत भारी विकास में है, इसलिए यह ऐसा कुछ है जो स्नैपशॉट्स पर टाइपशेक लग रहा है। आप एक [स्नैपशॉट बिल्ड] डाउनलोड कर सकते हैं (http: //pre.racket-lang।संगठन/इंस्टॉलर /) यदि आप चाहें तो वे आमतौर पर काफी स्थिर हैं। अन्यथा, आपको अगली रिलीज तक इंतजार करना पड़ सकता है। –
@JDavidSmith अगर आप '#: - 'केस को हटाते हैं, हालांकि, यह रैकेट 6.1.1 पर टाइपशेक करेगा। –