एमएल प्रकार 'ए ->' बी


19

हमारे प्रोफेसर ने हमें OCaml में एक फंक्शन के बारे में सोचने के लिए कहा, जिसमें टाइप है

'a -> 'b

यानी एक तर्क का एक कार्य जो कुछ भी हो सकता है, और वह एक अलग चीज को वापस कर सकता है।

मैंने raiseऐसे फ़ंक्शन में उपयोग करने के बारे में सोचा जो इसके तर्क की उपेक्षा करता है:

let f x = raise Exit

लेकिन प्रोफेसर ने कहा कि एक ऐसा समाधान था जिसे मानक पुस्तकालय में किसी भी फ़ंक्शन की आवश्यकता नहीं है। मैं उलझन में हूँ: 'bयदि आप पहली जगह में नहीं हैं तो आप कैसे बना सकते हैं ?

मैं यहां स्टैक ओवरफ्लो के बजाय पूछ रहा हूं क्योंकि मैं यह समझना चाहता हूं कि क्या हो रहा है, मैं सिर्फ एक कार्यक्रम नहीं स्पष्टीकरण के साथ देखना चाहता हूं।


2
कृपया अपने उत्तर में CS101 छात्र सीखने की प्रोग्रामिंग को लक्षित करें, न कि उस प्रकार के सिद्धांतकार को जो आपका उत्तर उसे बाद में बनने के लिए प्रेरित कर सकता है।
गाइल्स का SO-

यह raiseसमझने में मदद करेगा कि आपने यह कैसे पता लगाया कि यह कैसे काम करेगा, इसलिए हम जानते हैं कि यह समझाने के लिए कि आपके प्रोफेसर जिस समाधान की तलाश कर रहे हैं (जो उन्हीं कारणों से raiseकाम करेगा) कैसे काम करता है।
sepp2k

@ sepp2k raise : exn -> 'aतो मुझे रिटर्न वैल्यू मिल सकती है, मैं सिर्फ तर्क को नजरअंदाज करता हूं।
गिल्स एसओ-


जवाबों:


18

कंकाल है let f x = BODY। BODY में आपको केवल जेनेरिक तरीकों से x का उपयोग करना चाहिए (उदाहरण के लिए, इसे किसी ऐसे फ़ंक्शन को न भेजें जो पूर्णांकों की अपेक्षा करता है), और आपको किसी अन्य प्रकार का मान वापस करना होगा । लेकिन बाद का हिस्सा कैसे सच हो सकता है? कथन को सभी प्रकारों के लिए संतुष्ट करने का एकमात्र तरीका है, 'bलौटाया गया मान प्रकार का एक मान है 'b"यह सुनिश्चित करने के लिए कि फ़ंक्शन वापस नहीं आता है । वहाँ बिल्कुल दो संभावनाएँ हैं: या तो दोष या यह समाप्त नहीं करता है। फ़ंक्शन raiseदोष, निम्नलिखित समाप्त नहीं करता है:

let rec f x = f x

19

सबसे पहले, कुछ टिप्पणी। केवल मूल टाइप किए गए लैम्ब्डा कैलकुलस का उपयोग करना संभव नहीं है 'a -> 'bक्योंकि टाइपिंग सिस्टम पत्राचार में ( करी हावर्ड आइसोमॉर्फिज़्म के माध्यम से ) अंतर्ज्ञानवादी लॉजिक्स के लिए है, और संबंधित सूत्र A → Bएक टॉटोलॉजी नहीं है।

अन्य एक्सटेंशन जैसे ट्यूपल्स और मैचिंग / कंडीशनल्स अभी भी कुछ प्रकार की लॉजिक संगति को संरक्षित करते हैं *जो कि प्रोडक्ट टाइप्स को जोड़ते हैं जो तार्किक संयोजक और , और सम प्रकार के होते हैं |जो या के अनुरूप होते हैं । फिर से, उनसे उस 'a -> 'bप्रकार का उत्पादन करने की अपेक्षा न करें, क्योंकि यह किसी एक सूत्र को सिद्ध करने की अनुमति देगा जो कि एक शब्द नहीं है।

तो आपके एकमात्र मौके अन्य निर्माणों का उपयोग कर रहे हैं जो लॉजिक से बचते हैं जैसे raise(लेकिन आपको इस मामले में अनुमति नहीं है) ... या let rec! पुनरावृत्ति उन कार्यक्रमों का निर्माण करने की अनुमति देता है जो कभी समाप्त नहीं होते हैं, और उनके परिणामों को एक मनमाना रिटर्न प्रकार दिया जा सकता है क्योंकि वे कभी भी उत्पादित नहीं होंगे। अब अगर आप सबसे तुच्छ गैर समाप्त होने वाले फ़ंक्शन के बारे में सोचते हैं (एक जो सीधे परिणाम के लिए खुद को कॉल करता है):

let rec f x = f x

आप देखेंगे कि इसका प्रकार ठीक है 'a -> 'b: जो भी प्रदान किया गया तर्क है, परिणाम (जिसकी गणना कभी नहीं होगी) को किसी भी प्रकार का माना जा सकता है।

बेशक यह fएक दिलचस्प कार्य नहीं है, लेकिन यह बात है। ओकेएमएलएल में, कोई भी फ़ंक्शन जिसका प्रकार वैध फॉर्मूला नहीं दिखता है, एक संदिग्ध फ़ंक्शन है।


पूछने वाले को आपके पहले दो पैराग्राफ का एक शब्द समझ में नहीं आया, लेकिन मुझे आपका वाक्य पसंद है "उनके परिणामों को एक मनमाना रिटर्न प्रकार दिया जा सकता है क्योंकि वे कभी उत्पन्न नहीं होंगे"।
गाइल्स का SO- बुराई पर रोक

1

संकलक आदिम का उपयोग करके आप इसे लिख सकते हैं:

external magic: 'a -> 'b = "%identity"

(और वास्तव में संकलक वितरण यह प्रदान करता है, हालांकि यह भाषा का हिस्सा नहीं है)। यह एक असुरक्षित पहचान कास्ट है।

आपके प्रोफेसर लगभग निश्चित रूप से यह नहीं चाहते हैं। हालांकि, यह केवल उस प्रकार के साथ उपयोगी फ़ंक्शन है जिसके 'a -> 'bबारे में मैं जानता हूं, और वास्तव में इसका उपयोग ओकेएमएल वितरण में ही किया जाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.