एक फंक्शन के लिए एक कंस्ट्रक्टर के लिए उचित शब्द क्या है - डेटा प्रकार से मान को अनफ्रैप करने के लिए?


13

संपादित करें: मैं सवाल को थोड़ा सा दोहरा रहा हूं। जाहिरा तौर पर मैंने कुछ भ्रम का कारण बना क्योंकि मुझे एहसास नहीं था कि विध्वंसक शब्द OOP में कुछ अलग तरह से उपयोग किया जाता है - यह एक फ़ंक्शन है जब किसी ऑब्जेक्ट को नष्ट किया जा रहा है। कार्यात्मक प्रोग्रामिंग में हम (उत्परिवर्तित) उत्परिवर्तित अवस्था से बचते हैं, इसलिए इसके बराबर नहीं है। (मैंने प्रश्न के लिए उचित टैग जोड़ा है।)

इसके बजाय, मैंने देखा है कि एक मूल्य को उजागर करने के लिए रिकॉर्ड फ़ील्ड (विशेष रूप से एकल-मूल्यवान डेटा प्रकारों जैसे कि newtype) को कभी-कभी विध्वंसक या शायद डिकंस्ट्रक्टर कहा जाता है । उदाहरण के लिए, आइए (हास्केल में):

newtype Wrap = Wrap { unwrap :: Int }

यहाँ Wrapकंस्ट्रक्टर है और unwrapक्या है?

प्रश्न हैं:

  • हम unwrapकार्यात्मक प्रोग्रामिंग में कैसे कॉल करते हैं ? Deconstructor? नाशक? या किसी और शब्द से?
  • और स्पष्ट करने के लिए, क्या यह / अन्य शब्दावली अन्य कार्यात्मक भाषाओं पर लागू है , या क्या यह केवल हास्केल में उपयोग किया जाता है?
  • शायद, सामान्य रूप से गैर-कार्यात्मक भाषाओं में भी इसके लिए कोई शब्दावली है ?

मैंने उदाहरण के लिए दोनों शब्द देखे हैं:

... सबसे अधिक, एक इन के साथ काम करने में आसानी के लिए स्मार्ट कंस्ट्रक्टर और डिस्ट्रक्टर्स की आपूर्ति करता है। ...

पर हास्केल विकी , या

... यहाँ सामान्य विषय है कंस्ट्रक्टर फ्यूज करना - डिकंस्ट्रक्टर जोड़े जैसे ...

पर हास्केल wikibook (यहाँ यह शायद थोड़ा अधिक सामान्य अर्थ में मतलब है), या

newtype DList a = DL { unDL :: [a] -> [a] }

UnDL समारोह हमारे है Deconstructor , जो डीएल निर्माता निकाल देता है। ...

में असली दुनिया हास्केल



3
यह हास्केल के लिए विशेष प्रतीत होता है (हास्केल में एक "विध्वंसक" C ++ की तरह ही अवधारणा नहीं है। नाम समानता भ्रामक है)। यदि आप "मूल्य का पता लगाना" की सामान्य अवधारणा चाहते हैं, तो आपको शायद उदाहरण के रूप में हास्केल का उपयोग नहीं करना चाहिए। सी ++ में - भाषाओं की तरह, इस तरह के "अल्ट्रॉपर" बस एक गटर हो सकते हैं!
एंड्रेस एफ।

1
मेरा सुझाव है कि आप प्रश्न से "विध्वंसक" शब्द को हटा दें, इसके बजाय "अलंकार" का उपयोग करें, और पूछें कि क्या भाषाओं में इस पैटर्न का एक सामान्य नाम है :)
एंड्रेस एफ।

1
.Anapply, या "एक्सट्रैक्टर" स्कैला में एक मोटा एनालॉग है, लेकिन शायद इसका कोई नाम नहीं है क्योंकि ज्यादातर मामलों में आप बस पैटर्न मैच करते हैं
जीन टी

जवाबों:


5

अवधारणा के लिए कई शर्तें हैं। Deconstructing वह है जो मैं मानता हूं कि हास्केल हलकों में आम है, यह वही है जिसे रियल वर्ल्ड हास्केल कहता है। मेरा मानना ​​है कि शब्द का विनाश (या विनाशकारी बाँध) लिस्प सर्कल में आम है।


1
दिलचस्प है कि कैसे एक ही बात एक अलग अवधि एक भाषा से अगले करने के लिए, सी # में चुनिंदा में नक्शा बदल जाता है की तरह हो जाता है, हास्केल गुना तुतलाना / जावा को कम कर दिया है और गहरे लाल रंग का इंजेक्षन है है, हास्केल बाँध स्केला है flatmap सी # selectmany है है
जिमी हौफा

इसे वास्तव में हास्केल सर्कल में डिकंस्ट्रक्शन कहा जाता है। यदि यह अजीब लगता है, तो ध्यान रखें कि हास्केल की कोई वस्तु नहीं है - सिर्फ मूल्य; तो यह बिना कहे चला जाता है कि इस शब्द का एक अलग अर्थ है। महान हिस्सा यह है कि 'डिकंस्ट्रक्शन' वास्तव में यही करता है। उस नोट पर, मुझे व्यक्तिगत रूप से लगता है कि ऑब्जेक्ट डिकंस्ट्रक्टर्स को ऑब्जेक्ट डिस्पोजर्स की तर्ज पर कुछ कहा जाना चाहिए। यह बहुत अधिक सटीक है।
मास्टरमैटिक

8

विध्वंसक वह शब्द है जिसका उपयोग C ++ और शायद अन्य भाषाओं द्वारा किया जाता है, जिनके बारे में मुझे जानकारी नहीं है। वे निर्माणकर्ता द्वारा बनाए गए स्रोतों को जारी करने के लिए उपयोग किए जाते हैं, इसलिए वे इसके ठीक विपरीत करते हैं। हो सकता है कि अवधारणा हस्केल का शाब्दिक अनुवाद न करे, लेकिन यह शब्द कुछ स्थानों पर इस्तेमाल किया गया लगता है।

संपादित करें: प्रश्न को आपके संपादन को ध्यान में रखते हुए, मैं इसे तब एक अलंकारक कहूंगा ... मैं मूल प्रश्न का उत्तर देने में सक्षम था, लेकिन अब यह मेरे ज्ञान से दूर चला गया है इसलिए इस संपादन को भी गंभीरता से न लें।


1
ध्यान दें कि C ++ / C # / Java का "डिस्ट्रक्टर" शब्द का उपयोग हास्केल से मेल नहीं खाता है। समान शब्द, विभिन्न अवधारणाएँ।
एंड्रेस एफ।

1
@AndresF। हां, इसीलिए मैंने वाक्य जोड़ा:Maybe in Haskell this does not translate really well but I don't know the language.
marco-fiset

1
पर्याप्त रूप से, मैंने अपने पतन को हटा दिया। मुझे लगता है कि जो गुमराह किया गया है वह वास्तविक सवाल है, जो एक बात पूछ रहा है, लेकिन वास्तव में एक और पूछ रहा है! :)
एंड्रेस एफ।

@AndresF। हां सवाल भ्रामक है। ओपी पूछते हैं: What's the proper term for a function inverse to a constructor?। जब तक प्रश्न कुछ हास्केल अवधारणा के लिए अधिक विशिष्ट होने के लिए संपादित नहीं होता है, तब तक मैं अपना उत्तर छोड़ दूंगा।
मार्को-फिसेट

1
बस एक नोट में, C # में फ़ाइनलीज़र है लेकिन डिस्ट्रक्टर्स नहीं हैं, जो अलग-अलग हैं क्योंकि फ़ाइनलीज़र्स में गैर-नियतात्मक निष्पादन होता है। तो शायद C # में विध्वंसक के मिथ्या नाम को न फैलाने के लिए अपने उत्तर को संपादित करें।
जिमी होफा

6

OOP में, एक कंस्ट्रक्टर एक फ़ंक्शन या भाषा का निर्माण होता है, जो एक नई ऑब्जेक्ट (ऑब्जेक्ट का निर्माण करता है) को इनिशियलाइज़ करता है और आरंभ करता है, और एक विध्वंसक इसका ड्यूल, एक फंक्शन या लैंग्वेज कंस्ट्रक्शन होता है, जो ऑब्जेक्ट के बाद सफाई करता है (किसी भी ऑब्जेक्ट को रिलीज़ करके) रखती है) और इसे हटा देता है।

हालाँकि, जब से हास्केल (इसके विपरीत, कहते हैं, C ++) में कचरा संग्रह है और यह परस्पर स्थिति या अन्य दुष्प्रभावों का समर्थन नहीं करता है (कम से कम सीधे नहीं), ओओपी अर्थ में विनाशकारी धारणा के लिए बिल्कुल कोई कारण नहीं है। इसके अलावा, OOP कंस्ट्रक्टरों के विपरीत, हास्केल कंस्ट्रक्टरों के पास सिर्फ ऑब्जेक्ट निर्माण की तुलना में अधिक अनुप्रयोग हैं; वे भी व्यापक रूप से पैटर्न मिलान (उदाहरण के लिए नीचे देखें) में उपयोग किए जाते हैं।

अपने कोड उदाहरण में, 'खोलना' एक है रिकॉर्ड क्षेत्र है, और यह कैसे किया जाता है पर निर्भर करता है, मैं एक के रूप में यह भी दिखाई दे सकता एक्सेसर , या हो सकता है यहां तक कि एक गेटर , (हालांकि बाद भी एक लेंस संदर्भ में प्रयोग किया जाता है, तो यह हो सकता है वास्तव में थोड़ा भ्रमित होना)।

मैंने स्वयं हास्केल संदर्भ में प्रयुक्त शब्द 'विध्वंसक' (या 'डिकंस्ट्रक्टर') को कभी नहीं सुना है; एंड्रेस एफ नोट्स के रूप में, हालांकि, यह कभी-कभी एक फ़ंक्शन को संदर्भित करने के लिए उपयोग किया जाता है जो एक कंस्ट्रक्टर द्वारा शुरू की गई रैपिंग को अनडू करता है। मेरी समझ में, एक रिकॉर्ड गेट्टर एक विध्वंसक के रूप में काम कर सकता है, लेकिन इसलिए नियमित कार्य कर सकता है, बशर्ते कि वे अधिक जटिल डेटा प्रकार से वापस मान प्राप्त करें। उदाहरणों में शामिल हैं maybeऔर eitherप्रस्तावना से।

ध्यान दें कि unwrap, आपके उदाहरण में, कई चीजें हो सकती हैं:

  • एक समारोह (किसी भी अन्य की तरह): आप, उदाहरण के लिए, कर सकते हैं map unwrap [ Wrap 23, Wrap 42 ]; यह उपयोग लगभग OOP में एक गेट्टर विधि के बराबर है।
  • एक रिकॉर्ड निर्माण में एक रिकॉर्ड क्षेत्र विनिर्देशक: let w = Wrap { unwrap = 23 }
  • एक रिकॉर्ड अद्यतन में एक रिकॉर्ड क्षेत्र विनिर्देशक let w' = w { unwrap = 23 }:; यह OOP में सेटर विधियों के समान है (यदि आप बहुत निचोड़ते हैं)।
  • पैटर्न मिलान में रिकॉर्ड फ़ील्ड स्पेसियर: f Wrap { unwrap = a } = a

हास्केल कंस्ट्रक्टर्स के बारे में सोचना शायद सबसे अच्छा है क्योंकि ओओपी कंस्ट्रक्टर्स से बिल्कुल अलग। मेरा सुझाव है कि आप (पुनः) बेहतर समझ के लिए हास्केल प्रोग्रामिंग भाषा पर एक अच्छी पुस्तक पढ़ें - "रियल वर्ल्ड हास्केल" वास्तव में अच्छा है, और मैंने "लुक यू ए हास्केल" के बारे में अच्छी बातें सुनी हैं । दोनों में विशेष रूप से रचनाकारों और रिकॉर्ड सिंटैक्स के बारे में अच्छी व्याख्या होनी चाहिए।


2
हास्केल समुदायों में "विध्वंसक" शब्द के उपयोग के साक्ष्य: haskell.org/pipermail/beginners/2010-April/003946.html और mail-archive.com/haskell-cafe@haskar.org/msg26463.html । हास्केल लिंगो में एक "विध्वंसक" एक "अलंकार" है, एक अवधारणा पूरी तरह से स्मृति प्रबंधन या अंतिम चयन के लिए असंबंधित है।
एंड्रेस एफ।

3
मेरे थीसिस निर्देशक, जो विशेष रूप से हास्केल में कार्यक्रम करते हैं, एक अलंकार के लिए "विध्वंसक" शब्द का भी उपयोग करते हैं।
एंड्रेस एफ।

खैर, मैं कभी इस पद पर नहीं आया था। आप बिल्कुल सही हैं, जब उपयोग किया जाता है, तो ओओपी में विध्वंसक अवधारणा से इसका कोई लेना-देना नहीं है।
tdammers

@AndresF .: अपनी टिप्पणी का सम्मान करने के लिए संपादित।
tdammers

@AndresF। यह दिलचस्प है क्योंकि मैंने कभी भी इसे एक विध्वंसक के रूप में संदर्भित नहीं सुना, हालांकि यह एक तरफ, क्या इसे केवल रिकॉर्ड क्षेत्र के रूप में संदर्भित करना भी सटीक नहीं होगा, और जिस तकनीक को मैं "विध्वंसक" कहता हूं, वहां सिर्फ एक पैटर्न मैच के रूप में देखा जाता है ? मैं समझता हूं कि इसे "विनाशकारी" कहा जाता है जब आपका मैच एक सूची को अलग कर रहा है, तो क्या यह संभवतः संबंधित शब्द है लेकिन एक एडीटी के संदर्भ में? एक सूची को नष्ट करने के बाद एक ADT पर काम कर रहा है, क्योंकि एक सूची है .. मुझे stackoverflow.com/questions/11677806/…
जिमी होफा

2

मुझे लगता है कि विनाशकारी व्यापक शब्द है। जावा और VB.NET जैसी कुछ भाषाओं में एक अंतिम रूप है। /programming/171952/is-there-a-destructor-for-java


सी ++ में एक विध्वंसक - जैसे भाषाएं आवंटित मेमोरी जारी करने से पहले सफाई क्रियाएं करती हैं। हास्केल में एक विध्वंसक इसकी "बाहरी परत" से एक मूल्य को उजागर करता है (आप इसका उपयोग किसी भी चीज को साफ करने के लिए नहीं करते हैं)। वे वास्तव में संबंधित अवधारणाएं नहीं हैं।
एंड्रेस एफ।

2
मुझे लगता है मुझे नहीं पता था कि यह हास्केल प्रश्न है।
जेएफओ

यह वास्तव में स्पष्ट नहीं था। इस सवाल को अब रेट किया गया है और सुधार किया गया है :)
एंड्रेस एफ।

2

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

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