क्या फ़ंक्शन पैरामीटर प्रकार के रूप में नीचे के प्रकार के लिए कोई उपयोग मामला है?


12

यदि किसी फ़ंक्शन में a ( निचला प्रकार ) रिटर्न प्रकार है , तो इसका मतलब है कि यह कभी नहीं लौटाता है। उदाहरण के लिए बाहर निकलना या फेंकना, दोनों ही काफी सामान्य स्थितियाँ हैं।

संभवतया यदि किसी फ़ंक्शन में ably का कोई पैरामीटर होता है तो इसे कभी भी (सुरक्षित रूप से) नहीं कहा जा सकता है। क्या इस तरह के फ़ंक्शन को परिभाषित करने के लिए कभी कोई कारण हैं?

जवाबों:


17

या खाली प्रकार के परिभाषित गुणों में से एक यह है कि हर प्रकार A के लिए एक फ़ंक्शन A मौजूद है । वास्तव में, वहाँ एक से मौजूद है अद्वितीय ऐसे कार्य करते हैं। इसलिए, मानक पुस्तकालय के हिस्से के रूप में इस फ़ंक्शन के लिए काफी उचित है। अक्सर इसे कुछ कहा जाता है । (Subtyping साथ सिस्टम में, इस होने से बस संभाला जा सकता है हर प्रकार की एक उप-प्रकार हो। फिर निहित रूपांतरण है । एक अन्य संबंधित दृष्टिकोण करने के लिए है परिभाषित रूप अल्फा अल्फा जो केवल किया जा सकता है instantiated किसी भी प्रकार के।)Aabsurdabsurd α.α

E+AEthrow:EAf:ABBBabsurd

AabsurdabsurdA

भले ही इस तरह के फ़ंक्शन को लिखने का कोई कारण नहीं है, यह आम तौर पर अभी भी अनुमति दी जानी चाहिए । एक कारण यह है कि यह कोड जेनरेशन टूल्स / मैक्रोज़ को सरल बनाता है।


तो इसका मतलब है जैसे (x ? 3 : throw new Exception())कुछ और के साथ विश्लेषण प्रयोजनों के लिए जगह मिलती है (x ? 3 : absurd(throw new Exception()))?
bdsl

α.αabsurdabsurdthrowα.α

6

फ़ंक्शन के बारे में जो कहा गया है उसे जोड़ने के लिए absurd: ⊥ -> aमेरे पास एक ठोस उदाहरण है जहां यह फ़ंक्शन वास्तव में उपयोगी है।

हास्केल डेटा-प्रकार पर विचार करें Free f aजो एक सामान्य ट्री संरचना का प्रतिनिधित्व करता है जिसमें f-शून्य नोड्स और पत्तियां शामिल हैं a:

data Free f a = Op (f (Free f a)) | Var a

इन पेड़ों को निम्नलिखित कार्य के साथ मोड़ा जा सकता है:

fold :: Functor f => (a -> b) -> (f b -> b) -> Free f a -> b
fold gen alg (Var x) = gen x
fold gen alg (Op x) = alg (fmap (fold gen alg) x)

संक्षेप में, यह ऑपरेशन algनोड्स और genपत्तियों पर रखता है ।

अब इस बिंदु पर: सभी पुनरावर्ती डेटास्ट्रक्चर को एक निश्चित-बिंदु डेटाटाइप का उपयोग करके दर्शाया जा सकता है। हास्केल में यह है Fix fऔर इसे परिभाषित किया जा सकता है type Fix f = Free f ⊥(जैसे कि पेड़ के fआकार वाले नोड्स और फ़नकार के बाहर कोई पत्तियां नहीं f)। परंपरागत रूप से इस संरचना का एक तह भी है, जिसे cata:

cata :: Functor f => (f a -> a) -> Fix f -> a
cata alg x = fold absurd alg x

जो बेतुका का काफी साफ-सुथरा उपयोग देता है: चूंकि पेड़ में कोई पत्तियां नहीं हो सकती हैं (चूंकि quite के अलावा कोई अन्य निवासी नहीं है undefined), genइस तह के लिए उपयोग करना कभी संभव नहीं है और यह absurdदिखाता है कि!


2

निचला प्रकार हर दूसरे प्रकार का एक उपप्रकार है, जो व्यवहार में अत्यंत उपयोगी हो सकता है। उदाहरण के लिए, NULLC के एक सैद्धांतिक प्रकार-सुरक्षित संस्करण का प्रकार हर दूसरे पॉइंटर प्रकार का एक उपप्रकार होना चाहिए, अन्यथा आप उदाहरण के लिए वापस नहीं लौट सकते NULLजहां char*अपेक्षित था; इसी तरह, undefinedसैद्धांतिक प्रकार-सुरक्षित जावास्क्रिप्ट का प्रकार भाषा में हर दूसरे प्रकार का एक उपप्रकार होना चाहिए।

exit()throw()IntIntexit()

TST


3
NULLएक इकाई प्रकार यह नहीं है, जो unit से अलग है जो खाली प्रकार है?
बीडीएसएल

मुझे यकीन नहीं है कि टाइप थ्योरी में ≺ का क्या मतलब है।
बीडीएसएल

1
@bdsl यहाँ घुमावदार ऑपरेटर "" का एक उपप्रकार है; मुझे यकीन नहीं है कि यह मानक है, यह सिर्फ वही है जो मेरे प्रोफेसर ने इस्तेमाल किया।
ड्रेकिन

1
@ gnasher729 सच है, लेकिन सी भी विशेष रूप से सुरक्षित नहीं है। मैं कह रहा हूं कि यदि आप केवल एक पूर्णांक नहीं डाल सकते हैं void*, तो आपको इसके लिए एक विशिष्ट प्रकार की आवश्यकता होगी जिसका उपयोग किसी भी सूचक प्रकार के लिए किया जा सकता है।
ड्रेकिन


2

ऐसा एक उपयोग है जिसके बारे में मैं सोच सकता हूं, और यह कुछ ऐसा है जिसे स्विफ्ट प्रोग्रामिंग भाषा में सुधार के रूप में माना गया है।

स्विफ्ट में एक maybeमोनाड है, वर्तनी है Optional<T>या T?। इसके साथ बातचीत करने के कई तरीके हैं।

  • आप जैसे सशर्त अलौकिक का उपयोग कर सकते हैं

    if let nonOptional = someOptional {
        print(nonOptional)
    }
    else {
        print("someOptional was nil")
    }
    
  • आप उपयोग कर सकते हैं map, flatMapमूल्यों को बदलने के लिए

  • बल पूर्ववत संचालक ( !प्रकार का (T?) -> T) सामग्री को जबरन खोलना, अन्यथा किसी दुर्घटना को ट्रिगर करना
  • अपना मान लेने के लिए या अन्यथा डिफ़ॉल्ट मान का उपयोग करने के लिए nil-coalescing ऑपरेटर ( ??प्रकार का (T?, T) -> T):

    let someI = Optional(100)
    print(someI ?? 123) => 100 // "left operand is non-nil, unwrap it.
    
    let noneI: Int? = nil
    print(noneI ?? 123) // => 123 // left operand is nil, take right operand, acts like a "default" value
    

दुर्भाग्य से, यह कहने का कोई संक्षिप्त तरीका नहीं था कि "त्रुटि को अनचाहे या फेंक दें" या "कस्टम त्रुटि संदेश के साथ खोलना या दुर्घटना करना"। कुछ इस तरह

let someI: Int? = Optional(123)
let nonOptionalI: Int = someI ?? fatalError("Expected a non-nil value")

संकलित नहीं करता है, क्योंकि fatalErrorटाइप () -> Never( ()है Void, स्विफ्ट 'इकाई प्रकार, Neverस्विफ्ट का निचला प्रकार है)। इसे कॉल करना उत्पादन करता है Never, जो Tकि एक सही ऑपरेंड के रूप में अपेक्षित के साथ संगत नहीं है ??

इसे मापने केSE-0217 प्रयास में, स्विफ्ट इवोल्यूशन का प्रस्ताव - " अनअवरप या डाई" ऑपरेटर को सामने रखा गया। अंततः इसे अस्वीकार कर दिया गया था , लेकिन इसने Neverसभी प्रकारों का एक उपप्रकार बनाने में रुचि पैदा की ।

यदि Neverसभी प्रकारों का उपप्रकार बनाया गया था, तो पिछला उदाहरण संकलन योग्य होगा:

let someI: Int? = Optional(123)
let nonOptionalI: Int = someI ?? fatalError("Expected a non-nil value")

क्योंकि कॉल साइट का ??प्रकार है (T?, Never) -> T, जो के (T?, T) -> Tहस्ताक्षर के साथ संगत होगा ??


0

स्विफ्ट में एक प्रकार "नेवर" होता है, जो नीचे के प्रकार की तरह लगता है: वापसी के लिए घोषित एक फ़ंक्शन कभी नहीं लौट सकता है, प्रकार के पैरामीटर के साथ एक फ़ंक्शन कभी नहीं कहा जा सकता है।

यह प्रोटोकॉल के संबंध में उपयोगी है, जहां भाषा के प्रकार की प्रणाली के कारण प्रतिबंध हो सकता है कि एक वर्ग का एक निश्चित कार्य होना चाहिए, लेकिन इस आवश्यकता के साथ कि इस फ़ंक्शन को कभी भी बुलाया जाना चाहिए, और तर्क के प्रकार क्या हैं इसकी कोई आवश्यकता नहीं है होने वाला।

विवरण के लिए आपको स्विफ्ट-इवोल्यूशन मेलिंग सूची के नए पदों पर एक नजर डालनी चाहिए।


7
"स्विफ्ट-इवोल्यूशन मेलिंग लिस्ट पर नए पोस्ट" बहुत स्पष्ट या स्थिर संदर्भ नहीं है। क्या मेलिंग सूची का कोई वेब संग्रह नहीं है?
डेरेक एल्किंस ने SE
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.