2015-12-23 3 views
9

हाल ही में मैं कोडओकैमल - एक असुरक्षित प्रकार क्या है? > पूर्णांक है, और वास्तव में यह एक चेतावनी पैदावार आश्चर्य की बात नहीं है -

List.fold_left (fun acc x -> raise x ; acc) 3 

मैं इस आंशिक आवेदन की एक कार्यात्मक मूल्य होने> प्रकार exn सूची के साथ पूरी तरह से ठीक हूँ दिया गया था । मैं कर रहा हूँ,> हालांकि, कुछ नहीं चेतावनी का क्या आधा मतलब है:

Warning 21: this statement never returns (or has an unsound type.) 

मैं वास्तव में इस चेतावनी के लिए किसी भी संदर्भ नहीं मिल सकता है, जहां यह एक गैर लौटने बयान का परिणाम नहीं है। यहां तक ​​कि ओकैमसीसी के लिए मैन पेज केवल इस चेतावनी के लिए गैर-वापसी वाले बयान का उल्लेख करता है, और चेतावनियां। एमएल इसे केवल nonreturning_statement के रूप में संदर्भित करता है।

मैं ध्वनि की अवधारणा से परिचित हूं क्योंकि यह टाइप सिस्टम से संबंधित है, लेकिन एक प्रकार का विचार जो स्वाभाविक रूप से अस्वस्थ है, वह मेरे लिए अजीब लगता है।

तो मेरी प्रश्न हैं:

वास्तव में क्या एक अस्वस्थ प्रकार है? एक ऐसी स्थिति क्या है जिसमें एक असाधारण प्रकार उत्पन्न होगा जब ओकैमल केवल कठोर असफल होने की बजाय चेतावनी जारी करेगा?

किसी ने इस प्रश्न को पोस्ट किया है, और जब मैं एक उत्तर लिख रहा था, तो इसे हटा दिया गया था। मेरा मानना ​​है कि प्रश्न बहुत रोचक और reposting के लायक है। आप कोई है जो आपकी मदद करने के :-(

+2

मुझे विश्वास है कि प्रश्न हटा दिया गया था क्योंकि यह http://stackoverflow.com/questions/31278561/avoid-the-warning-warning-21-this-statement-never-returns-or-has-an का डुप्लिकेट था -unsउंड-टी, जहां चेतावनी बाहरी (js_of_ocaml) फ़ंक्शन के उपयोग के कारण अनजान परिणाम प्रकार के साथ हुई थी - जैसा कि नीचे दिए गए आपके उत्तर में है। मुझे संदेह है कि प्रश्नकर्ता वह है जिसने मुझे स्वीकार्य उत्तर पर +1 दिया है। अनुमोदित, फोकस थोड़ा अलग है। – antron

+0

मैं वह व्यक्ति था जिसने उससे पूछा/हटा दिया; मैंने केवल यह देखा (हेहे)। क्या @antron ने कहा ठीक है क्यों मैंने इसे हटा दिया। और हाँ, वह +1 मुझसे था। ;) – Will

उत्तर

12

कैसे चेतावनी 21 बताया जाता है

पहले, आइए जो असंबंधित रिटर्न कार्यों की सोचते हैं तैयार है हो सकता है पर विचार करें 'a: मैं let id x = x यहाँ की तरह समारोह मतलब यह नहीं है क्योंकि यह है प्रकार 'a -> 'a और वापसी प्रकार 'a इनपुट। मैं raise : exn -> 'a और exit : int -> 'a जैसे कार्यों मतलब के साथ संबंधित है।

इन कार्यों असंबंधित 'a माना जाता है कभी नहीं लौटने। कोई 'a (अधिक सटीक forall 'a. 'a) है प्रकार के बाद से वापसी नागरिक। फ़ंक्शंस केवल एक चीज प्रोग्राम को समाप्त कर सकती है (बाहर निकलें या अपवाद उठाएं) या एक अनंत लूप में गिरना: let rec loop() = loop()

चेतावनी 21 का उल्लेख तब किया गया है जब एक कथन का प्रकार 'a है। उदाहरण के लिए (वास्तव में एक और शर्त है, लेकिन मैं सिर्फ सादगी के लिए छोड़ दें।),

# loop(); print_string "end of the infinite loop";; 
Warning 21: this statement never returns (or has an unsound type.) 

यह 21. चेतावनी का मुख्य उद्देश्य तो उत्तरार्ध क्या है?

"अस्वस्थ प्रकार"

चेतावनी 21 भी बयान रिटर्न अगर कुछ वास्तव में भेजी जा सके। इस मामले में, जैसा कि चेतावनी संदेश से पता चलता है कि कथन में एक असाधारण प्रकार है।

क्यों बेकार? चूंकि अभिव्यक्ति forall 'a. 'a प्रकार का मान लौटाती है, जिसमें कोई नागरिक नहीं है। यह टाइप सिद्धांत ओकैमल पर निर्भर करता है।

Obj.magic की

उपयोग:

OCaml में, वहाँ कई तरह के एक अस्वस्थ प्रकार के साथ एक अभिव्यक्ति लिखने के तरीके हैं।

external की
(Obj.magic 1); print_string "2" 

उपयोग: यह शिकंजा प्रकार प्रणाली इसलिए आप प्रकार 'a जो रिटर्न की एक अभिव्यक्ति लिख सकते हैं। Obj.magic के रूप में ही आपको किसी भी बाहरी मूल्यों और कार्यों के लिए मनमाने ढंग से प्रकार दे सकते हैं:

external crazy : unit -> 'a = "%identity" 
let f() = crazy() (* val f : unit -> 'a *) 
let _ = f(); print_string "3" 

OCaml प्रकार प्रणाली के लिए, यह असंभव है अस्वस्थ प्रकार के साथ गैर लौटने भाव और भाव भेद करने के लिए। यही कारण है कि यह ग़लत चीजों को त्रुटियों के रूप में रद्द नहीं कर सकता है। किसी बयान को बताने के लिए परिभाषाओं को ट्रैक करना एक असुरक्षित प्रकार है या नहीं, आमतौर पर असंभव है और जब भी संभव हो तब भी बहुत खर्च होता है।

+1

अच्छा जवाब। पूर्णता के लिए, आप असंतुलित कार्यों के रूप में demarshalling ('input_value' और' Marshal.from_ * ') का उल्लेख करना चाह सकते हैं। (वास्तव में मैं तर्क दूंगा कि वे 'Obj.magic' से अधिक उपयोगी हैं, खासकर किसी ऐसे व्यक्ति के लिए जो टाइप सिस्टम में विशेषज्ञ नहीं है)। – Virgile

संबंधित मुद्दे