कार्यात्मक भाषाओं में गेटर्स और सेटर्स


9

कार्यात्मक प्रोग्रामिंग के सिद्धांतों में से एक शुद्ध कार्यों का उपयोग है। एक शुद्ध कार्य वह है जो साइड-इफ़ेक्ट फ़्री और रेफ़रेंशियल रूप से पारदर्शी हो।

गेटर्स संदर्भित रूप से पारदर्शी नहीं होते हैं - यदि एक सेटर को कॉल करने के लिए गेट्टर के बीच में बुलाया जाता है, तो गेट्टर का रिटर्न वैल्यू बदल जाता है, भले ही इसके पैरामीटर (आमतौर पर कोई पैरामीटर नहीं)

सेटर्स साइड-इफेक्ट्स पैदा करते हैं - एक सेटर को कॉल करने से आम तौर पर एक मान में हेरफेर होता है जो इसका रिटर्न वैल्यू नहीं है (वास्तव में, पारंपरिक रूप से एक सेटर कुछ भी नहीं देता है)

मुझे पता है कि स्काला में हम केवल इस तथ्य को स्वीकार करते हैं कि हम दो प्रतिमानों (कार्यात्मक और वस्तु उन्मुख) को एक साथ जोड़ रहे हैं और गेटर्स / सेटर का उपयोग करते हैं जैसा कि हम जावा जैसी भाषा में करते हैं।

हास्केल जैसी भाषा में (जो कि मैं धाराप्रवाह नहीं हूं, लेकिन मुझे बताया गया है कि "शुद्ध" कार्यात्मक भाषा के लिए ट्रुअर है) मैं सिर्फ उत्सुक हूं, आप वस्तुओं पर ऐसे गुणों को कैसे मॉडल करेंगे कि गेटर्स संदर्भित रूप से पारदर्शी और सेटर्स हैं। दुष्प्रभाव मुक्त हैं?

क्या समाधान को वस्तु की एक प्रति वापस सेटर को पास करना होगा, जिसे सेटर के वापसी मूल्य के रूप में लागू किया गया था, और इस प्रति में संपत्ति के मूल्य में परिवर्तन शामिल है?


8
Getters और setters पैरामीटर के रूप में वस्तु है - भले ही यह आम तौर पर निहित है - तो ही टिककर खेल रहे हैं referentially पारदर्शी।

@delnan, केवल अगर यह पढ़ रहा है कि विशेषता अपरिवर्तनीय है।
dan_waterworth

3
@dan_waterworth: केवल अगर हम "समान" को "संदर्भित रूप से पारदर्शी" वस्तु पहचान के रूप में पढ़ते हैं। यदि वास्तव में अंतर्निहित विशेषता अलग है, तो यह विभिन्न तर्कों के साथ एक कॉल करता है (जो समानता की अधिकांश परिभाषाओं के अनुरूप है)। यह एक दूसरे थ्रेड को सेट करने वाले को अनदेखा कर रहा है और कॉल करने के बाद इसे गेट्टर और गेट्टर फिनिशिंग के बीच खत्म कर रहा है, लेकिन उस मामले में आपको वैसे भी अधिक गंभीर समस्याएं मिलीं।

जवाबों:


7

बिल्कुल सही। केस क्लास विधि copy, या लेंस की सामान्य अवधारणा देखें ।

विशेष रूप से, यदि राज्य को बदलने की आवश्यकता है, तो आप एक स्टेट मोनाड का उपयोग करेंगे। उस राज्य में बदलाव को लेंस के माध्यम से किया जा सकता है, जो "राज्य" से जानकारी निकालने और इसे आसान बनाने में मदद करता है।

सामान्य समस्या के बारे में यह प्रश्न भी देखें जो "राज्य" जैसी गहरी संरचना से आती है और इसमें परिवर्तन कर रही है। यदि आप उस में गहराई से जाना चाहते हैं तो उत्तर में लेंस और ज़िपर दोनों पर अच्छे संबंध हैं।


प्रश्न डैनियल: क्या कोई विशेष कारण है कि कॉपी () केस क्लासेस से जुड़ा हुआ है? यह विशेष रूप से केस क्लासेस की जरूरतों (गलत शब्द, लेकिन दूसरे के बारे में नहीं सोच सकता है) के लिए विशिष्ट नहीं लगता है, ऐसा लगता है (मुझे) सभी वर्गों के लिए उपयुक्त एक सुविधा का अधिक है। यदि मुझे अपने गैर-मामले वर्ग पर प्रतिलिपि () की आवश्यकता हो तो क्या होगा? क्या कोई विशेषता है जो मैं उस कार्यक्षमता को प्राप्त करने के लिए उपयोग कर सकता हूं?
Thaonon

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

11

खैर, हास्केल में, ऑब्जेक्ट्स (आमतौर पर) अपरिवर्तनीय होते हैं, इसलिए गेटर्स (जो आपको रिकॉर्ड सिंटैक्स का उपयोग करते समय मिलता है) या फ़ंक्शन जो गेटर्स की तरह कार्य करते हैं, वे संदर्भात्मक रूप से पारदर्शी होते हैं। और फिर आप वस्तुओं पर मूल्यों को "सेट" नहीं करते हैं - अगर कुछ भी आप एक नई वस्तु बनाते हैं जो पुराने के समान है, लेकिन खेतों में से एक के लिए एक अलग मूल्य के साथ। यह भी एक शुद्ध कार्य है।


1
"वस्तुएं (आमतौर पर) अपरिवर्तनीय हैं" वे कब नहीं हैं?
सारा

-1

"गेटर्स एंड सेटर्स में ऑब्जेक्ट पैरामीटर के रूप में होता है - भले ही यह आमतौर पर निहित हो - इसलिए गेटर्स संदर्भात्मक रूप से पारदर्शी होते हैं - डेलरैन"।

प्रासंगिक रूप से पारदर्शी का मतलब है कि फ़ंक्शन ALWAYS समान इनपुट के लिए समान आउटपुट देता है; इसलिए यदि किसी वस्तु विशेषता को एक सेटर द्वारा बदल दिया गया है, तो आप उसी आउटपुट को नहीं लौटा रहे हैं। :)


लेकिन, यदि ऑब्जेक्ट को एक सेटर द्वारा बदल दिया गया था, तो गेट्टर (यानी अंतर्निहित स्व तर्क) के इनपुट को बदल दिया गया है।
स्टीफन सी। स्टील

1
ऑब्जेक्ट संदर्भ मान / पॉइंटर तब तक नहीं बदला है जब तक कि ऑब्जेक्ट को ढेर पर स्थानांतरित नहीं किया गया हो।
केसी नागफनी

5
हां, लेकिन तार्किक रूप से, निहित इनपुट ही ऑब्जेक्ट है, न कि पॉइंटर का मूल्य।
स्टीफन सी। स्टील

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