आप एक फ़ंक्शन को क्या कहते हैं जहां एक ही इनपुट हमेशा एक ही आउटपुट लौटाएगा, लेकिन इसके साइड इफेक्ट भी हैं?


43

कहें कि हमारे पास एक सामान्य शुद्ध कार्य है जैसे कि

function add(a, b) {
  return a + b
}

और फिर हम इसे ऐसे बदलते हैं कि इसका साइड इफेक्ट हो

function add(a, b) {
  writeToDatabase(Math.random())
  return a + b;
}

जहां तक ​​मुझे पता है यह एक शुद्ध कार्य नहीं माना जाता है क्योंकि मैं अक्सर लोगों को शुद्ध कार्यों को "साइड इफेक्ट्स के बिना कार्य" कहता हूं। हालाँकि, यह एक शुद्ध कार्य की तरह व्यवहार करता है जहाँ तक कि यह एक ही इनपुट के लिए एक ही आउटपुट लौटाएगा।

क्या इस प्रकार के फ़ंक्शन के लिए एक अलग नाम है, क्या यह अनाम है, या क्या यह अभी भी वास्तव में शुद्ध है और मुझे शुद्धता की परिभाषा के बारे में गलत समझा जाता है?


91
"शुद्ध कार्य नहीं"।
रॉस पैटरसन

2
@RossPatterson वही है जो मैंने भी सोचा था, लेकिन यह पूछकर कि मैंने संदर्भात्मक पारदर्शिता के बारे में सीखा है तो मुझे खुशी है कि मैंने इसे अपने पास नहीं रखा।
m0meni

9
यदि writeToDatabaseयह विफल हो जाता है तो यह एक अपवाद को ट्रिगर कर सकता है, जिससे आपका दूसरा addफ़ंक्शन एक अपवाद उत्पन्न करता है, भले ही उन्हीं तर्कों के साथ कहा जाए, जिनसे पहले समस्याएं नहीं हुई थीं ... अधिकांश समय साइड इफेक्ट्स इस तरह की त्रुटि-संबंधित स्थितियों का परिचय देते हैं जो टूट जाते हैं "इनपुट-आउटपुट शुद्धता"।
बाकुरू

25
कुछ जो हमेशा दिए गए इनपुट के लिए समान आउटपुट देते हैं उन्हें नियतात्मक कहा जाता है
njzk2

2
@ njzk2: सच है, लेकिन यह भी स्टेटलेस है । एक स्टेटफुल डिसेंटिविस्ट फंक्शन हर इनपुट के लिए समान आउटपुट नहीं दे सकता है। उदाहरण: यदि यह पिछले कॉल के समान तर्क के साथ कहा जाता है, तो F(x)लौटने के लिए परिभाषित किया गया है true। स्पष्ट रूप से अनुक्रम के साथ {1,2,2} => {undefined, false, true}यह नियतात्मक है, फिर भी यह अलग-अलग आउटपुट देता है F(2)
MSalters 10:16

जवाबों:


85

मैं शुद्धता की सार्वभौमिक परिभाषाओं के बारे में निश्चित नहीं हूं, लेकिन हास्केल के दृष्टिकोण से (एक भाषा जहां प्रोग्रामर शुद्धता और संदर्भात्मक पारदर्शिता जैसी चीजों की परवाह करते हैं), आपके कार्यों में से केवल "शुद्ध" है। दूसरा संस्करण addशुद्ध नहीं है । तो आपके प्रश्न के उत्तर में, मैं इसे "अशुद्ध" कहूंगा;)

इस परिभाषा के अनुसार, एक शुद्ध कार्य एक फ़ंक्शन है जो:

  1. केवल इसके इनपुट पर निर्भर करता है। यानी एक ही इनपुट को देखते हुए, यह हमेशा एक ही आउटपुट लौटाएगा।
  2. संदर्भित रूप से पारदर्शी है: फ़ंक्शन को स्वतंत्र रूप से इसके मूल्य से बदला जा सकता है और कार्यक्रम का "व्यवहार" नहीं बदलेगा।

इस परिभाषा के साथ, यह स्पष्ट है कि आपके दूसरे फ़ंक्शन को शुद्ध नहीं माना जा सकता है, क्योंकि यह नियम 2 को तोड़ता है। अर्थात, निम्नलिखित दो कार्यक्रम समान नहीं हैं:

function f(a, b) { 
    return add(a, b) + add(a, b);
}

तथा

function g(a, b) {
    c = add(a, b);
    return c + c;
}

ऐसा इसलिए है क्योंकि भले ही दोनों फ़ंक्शन समान मान लौटाएंगे, फ़ंक्शन fदो बार डेटाबेस gको लिखेगा लेकिन एक बार लिखेगा! यह बहुत संभावना है कि डेटाबेस को लिखता है आपके कार्यक्रम के अवलोकन योग्य व्यवहार का हिस्सा है, जिस स्थिति में मैंने आपके add"शुद्ध" नहीं होने का दूसरा संस्करण दिखाया है।

यदि डेटाबेस को लिखना आपके कार्यक्रम के व्यवहार का एक देखने योग्य हिस्सा नहीं है, तो दोनों संस्करणों को addसमकक्ष और शुद्ध माना जा सकता है। लेकिन मैं ऐसे परिदृश्य के बारे में नहीं सोच सकता जहाँ डेटाबेस में लिखना मायने नहीं रखता। यहां तक ​​कि लॉगिंग मामलों!


1
क्या "केवल इसके इनपुट पर निर्भर करता है" अनावश्यक पारदर्शिता को देखते हुए निरर्थक है? इसका अर्थ यह है कि RT शुद्धता का पर्याय है? (मैं इसके बारे में और अधिक भ्रमित हो रहा हूं जितने अधिक स्रोत मैं देख रहा हूं)
Ixrec

मैं मानता हूँ कि यह भ्रामक है। मैं केवल आकस्मिक उदाहरणों के बारे में सोच सकता हूं। कहना f(x)न केवल पर निर्भर करता है x, बल्कि कुछ बाहरी वैश्विक चर पर भी निर्भर करता है y। फिर, यदि आपके fपास RT की संपत्ति है , तो जब तक आप स्पर्श नहीं करते हैं, तब तक आप अपने रिटर्न के साथ इसकी सभी घटनाओं को स्वतंत्र रूप से स्वैप कर सकते हैं y। हां, मेरा उदाहरण संदिग्ध है। लेकिन महत्वपूर्ण बात यह है: यदि fडेटाबेस को लिखता है (या एक लॉग को लिखता है) यह आरटी की संपत्ति खो देता है: अब इससे कोई फर्क नहीं पड़ता कि आप वैश्विक yअछूता छोड़ देते हैं , आप जानते हैं कि क्या आप वास्तव में इस पर निर्भर करते हुए अपने प्रोग्राम के बदलाव का अर्थ जानते हैं कॉल fया बस इसके वापसी मूल्य का उपयोग करें ।
एंड्रेस एफ।

Humph। हम कहते हैं कि हमारे पास एक ऐसा फ़ंक्शन है जो साइड इफेक्ट्स को छोड़कर शुद्ध है और इस तरह के व्यवहार के लिए भी गारंटी है जहां आपके दो नमूने समतुल्य हैं। (मुझे लगा कि यह मामला वास्तव में सामने आया है, इसलिए यह काल्पनिक नहीं है।) मुझे लगता है कि हम काफी काम नहीं कर रहे हैं।
जोशुआ

2
मैं तर्क देता हूँ कि दूसरा कार्य नियम # 1 को भी तोड़ सकता है। उपयोग में डेटाबेस API की भाषा और त्रुटि हैंडलिंग प्रथाओं के आधार पर, फ़ंक्शन अच्छी तरह से कुछ भी वापस नहीं कर सकता है यदि डेटाबेस अनुपलब्ध है या किसी कारण के लिए db लेखन विफल रहता है।
जैच लिप्टन

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

19

आप किस फ़ंक्शन को कहते हैं [जिसके लिए] एक ही इनपुट हमेशा एक ही आउटपुट लौटाएगा, लेकिन इसके साइड इफेक्ट भी हैं?

ऐसे फ़ंक्शन को कहा जाता है

नियतात्मक

एक एल्गोरिथ्म जिसका व्यवहार इनपुट से पूरी तरह से भविष्यवाणी किया जा सकता है।

termwiki.com

राज्य के बारे में:

आपके द्वारा उपयोग किए जाने वाले फ़ंक्शन की परिभाषा के आधार पर, एक फ़ंक्शन की कोई स्थिति नहीं है। यदि आप वस्तु उन्मुख दुनिया से आते हैं, तो याद रखें कि x.f(y)यह एक विधि है। एक फ़ंक्शन के रूप में यह ऐसा दिखेगा f(x,y)। और यदि आप संलग्न लेक्सिकल स्कोप के साथ बंद हैं, तो याद रखें कि अपरिवर्तनीय स्थिति और साथ ही कार्य अभिव्यक्ति का हिस्सा हो सकता है। यह केवल परिवर्तनशील राज्य है जो कार्य नियतात्मक प्रकृति को प्रभावित करेगा। तो f (x) = x + 1 निर्धारक है इसलिए जब तक 1 नहीं बदलता है। कोई फर्क नहीं पड़ता कि 1 कहाँ संग्रहीत है।

आपके कार्य दोनों निर्धारक हैं। आपका पहला भी एक शुद्ध कार्य है। तुम्हारा दूसरा शुद्ध नहीं है।

शुद्ध कार्य

  1. फ़ंक्शन हमेशा एक ही परिणाम मान का मूल्यांकन करता है जिसे समान तर्क मान दिया गया है। फ़ंक्शन परिणाम मान किसी भी छिपी जानकारी या स्थिति पर निर्भर नहीं हो सकता है जो प्रोग्राम निष्पादन की कार्यवाही के दौरान या कार्यक्रम के विभिन्न निष्पादन के बीच बदल सकता है, और न ही यह I / O उपकरणों से किसी भी बाहरी इनपुट पर निर्भर हो सकता है।

  2. परिणाम का मूल्यांकन किसी भी शब्दानुभवनीय दुष्प्रभाव या आउटपुट का कारण नहीं बनता है, जैसे कि उत्परिवर्तनीय वस्तुओं का उत्परिवर्तन या I / O उपकरणों के आउटपुट।

wikipedia.org

बिंदु 1 का अर्थ निर्धारक होता है । बिंदु 2 का अर्थ है संदर्भात्मक पारदर्शिता । साथ में उनका मतलब है कि एक शुद्ध कार्य केवल उसके तर्क और उसके बदले हुए मूल्य को बदलने की अनुमति देता है। और कुछ नहीं परिवर्तन का कारण बनता है। और कुछ नहीं बदला है।


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

@ फ़्रेक्स सिस्टम मेमोरी अनुपलब्ध हो सकती है। सीपीयू अनुपलब्ध हो सकता है। निर्धारक होना सफलता की गारंटी नहीं देता है। यह गारंटी देता है कि सफल व्यवहार पूर्वानुमान योग्य है।
कैंडिड_ओरेंज

OOMing किसी भी फ़ंक्शन के लिए विशिष्ट नहीं है, यह समस्या की विभिन्न श्रेणी है। अब, आइए अपने "शुद्ध कार्य" परिभाषा के बिंदु 1 को देखें (जिसका वास्तव में अर्थ "नियतात्मक" है): "फ़ंक्शन परिणाम मान किसी भी छिपी जानकारी या स्थिति पर निर्भर नहीं कर सकता है जो प्रोग्राम निष्पादन की कार्यवाही या विभिन्न निष्पादन के बीच बदल सकता है कार्यक्रम , और न ही यह I / O उपकरणों से किसी भी बाहरी इनपुट पर निर्भर कर सकता है "। डेटाबेस उस तरह की स्थिति है, इसलिए ओप्स फ़ंक्शन स्पष्ट रूप से इस स्थिति को पूरा नहीं करता है - यह नियतात्मक नहीं है।
Frax

@ कॉन्डिड_ऑरेंज मैं सहमत होता अगर डीबी के लिए लिखता केवल इनपुट पर निर्भर होता। लेकिन यह है Math.random()। इसलिए नहीं, जब तक हम एक PRNG (एक भौतिक RNG के बजाय) मान लेते हैं और यह मानते हैं कि PRNG इनपुट के राज्य भाग (जो कि ऐसा नहीं है, संदर्भ हार्डकोड है), यह निर्धारक नहीं है।
marstato

1
निर्धारक राज्यों के अपने उद्धरण को @candied_orange "एक एल्गोरिथ्म जिसका व्यवहार इनपुट से पूरी तरह से भविष्यवाणी की जा सकती है।" IO को लिखना, मेरे लिए, निश्चित रूप से व्यवहार है, परिणाम नहीं।
marstato

9

यदि आप दुष्प्रभाव के बारे में परवाह नहीं करते हैं, तो यह संदर्भित रूप से पारदर्शी है। बेशक यह संभव है कि आप परवाह न करें लेकिन कोई और करता है, इसलिए शब्द की प्रयोज्यता संदर्भ-निर्भर है।

मुझे आपके द्वारा वर्णित गुणों के लिए एक सामान्य शब्द का पता नहीं है, लेकिन एक महत्वपूर्ण उपसमुच्चय वे हैं जो कि बेरोजगार हैं । कंप्यूटर विज्ञान में, गणित में थोड़ा अलग *, एक शानदार फ़ंक्शन एक है जिसे उसी प्रभाव के साथ दोहराया जा सकता है; कहने का मतलब यह है कि इसे कई बार करने का नेट-साइड-इफ़ेक्ट परिणाम एक ही बार करने जैसा है।

इसलिए, यदि आपका साइड-इफ़ेक्ट किसी निश्चित पंक्ति में एक निश्चित मान के साथ डेटाबेस को अपडेट करना है, या बिल्कुल सुसंगत सामग्री के साथ एक फ़ाइल बनाना है, तो यह बेकार होगा , लेकिन अगर यह डेटाबेस में जोड़ा जाता है, या फ़ाइल में जोड़ा जाता है , तो यह नहीं होगा।

संपूर्ण कार्यों के संयोजन एक पूरे के रूप में बेरोजगार हो सकते हैं या नहीं भी हो सकते हैं।

* के उपयोग idempotent गणित प्रकट होता है की तुलना में कंप्यूटर विज्ञान में अलग ढंग से गणितीय शब्द है कि तब अपनाया गया था क्योंकि अवधारणा उपयोगी है का गलत उपयोग से आए हैं।


3
शब्द "संदर्भित रूप से पारदर्शी" अधिक सख्ती से परिभाषित किया गया है कि "किसी को परवाह नहीं"। यहां तक कि अगर हम इस तरह के कनेक्शन समस्याओं, लापता कनेक्शन तार, समय समाप्ति, आदि के रूप आईओ मुद्दों की उपेक्षा, तो यह अभी भी आसान है कि एक प्रोग्राम है जो की जगह दिखाने के लिए (f x, f x)साथ let y = f x in (y, y)डिस्क स्थान-अपवादों में से बाहर में चलेंगे दोगुनी गति से आप बहस कर सकते इन हैं कि जिन मामलों की आपको परवाह नहीं है, लेकिन इस तरह की फजी परिभाषा के साथ-साथ हम new Random().Next()संदर्भित रूप से पारदर्शी कह सकते हैं क्योंकि बिल्ली, मुझे परवाह नहीं है कि मुझे वैसे भी क्या नंबर मिलता है।
सारा

@kai: संदर्भ के आधार पर, आप दुष्प्रभावों की अनदेखी कर सकते हैं। दूसरी ओर, यादृच्छिक जैसे फ़ंक्शन का रिटर्न मान कोई साइड इफेक्ट नहीं है: यह इसका मुख्य प्रभाव है।
जियोर्जियो

Random.Next.NET में @Giorgio के वास्तव में दुष्प्रभाव हैं। बहुत ज़्यादा। यदि आप Nextइसे किसी वैरिएबल को असाइन कर सकते हैं और फिर Nextदोबारा कॉल करके दूसरे वैरिएबल को असाइन कर सकते हैं , तो संभावना है कि वे समान नहीं होंगे। क्यों? क्योंकि आह्वान वस्तु Nextमें कुछ छिपी हुई आंतरिक स्थिति को बदल देता Randomहै। यह संदर्भात्मक पारदर्शिता के विपरीत ध्रुवीय है। मैं आपके दावे को नहीं समझता कि "मुख्य प्रभाव" दुष्प्रभाव नहीं हो सकते। अनिवार्य कोड में यह अधिक सामान्य नहीं है कि मुख्य प्रभाव एक साइड इफेक्ट है, क्योंकि स्वभाव से अनिवार्य कार्यक्रम होते हैं।
सारा

3

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


1
माना! यह "फ़ंक्शन" की गणितीय परिभाषा (अनौपचारिक रूप से) है, लेकिन जैसा कि आप कहते हैं, दुर्भाग्य से "फ़ंक्शन" का अर्थ प्रोग्रामिंग भाषाओं में कुछ अलग है, जहां यह "मूल्य प्राप्त करने के लिए आवश्यक एक कदम-दर-चरण प्रक्रिया" के करीब है।
एंड्रेस एफ।

2

यह मूल रूप से इस बात पर निर्भर करता है कि आप अशुद्धता के बारे में परवाह करते हैं या नहीं। यदि इस तालिका का शब्दार्थ यह है कि आपको परवाह नहीं है कि कितनी प्रविष्टियाँ हैं, तो यह शुद्ध है। और, यह शुद्ध नहीं है।

या इसे दूसरे तरीके से रखने के लिए, यह तब तक ठीक है जब तक कि शुद्धता पर आधारित अनुकूलन कार्यक्रम के शब्दार्थों को तोड़ न दें।

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


अच्छा वह निर्भर करता है। हो सकता है कि लॉग इसे अशुद्ध बनाते हैं, उदाहरण के लिए यदि आप इस बात की परवाह करते हैं कि कितनी बार, और किस समय, "INFO f () नामक" आपके लॉग में दिखाई देता है। जो आप अक्सर करते हैं :)
एंड्रेस एफ।

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

@AndresF। खैर, आप शायद समय की शाब्दिक संख्या के बारे में परवाह नहीं करते हैं। आप शायद केवल इस बात की परवाह करते हैं कि फ़ंक्शन के रूप में इसे कई बार लॉग किया गया है।
डेडएमजी

@Basilevs फ़ंक्शन का व्यवहार उन पर बिल्कुल निर्भर नहीं है। यदि लॉग राइट विफल रहता है, तो आप सही पर चलते हैं।
डेडएमजी

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

1

मैं कहूंगा कि पूछने के लिए सबसे अच्छी बात यह नहीं है कि हम इसे कैसे कहेंगे, लेकिन हम इस तरह के कोड का विश्लेषण कैसे करेंगे । और इस तरह के विश्लेषण में मेरा पहला महत्वपूर्ण सवाल होगा:

  • क्या साइड इफेक्ट फ़ंक्शन के तर्क पर निर्भर करता है, या साइड इफेक्ट पर परिणाम?
    • नहीं: "प्रभावी कार्य" को एक शुद्ध कार्य, एक प्रभावी कार्रवाई और उनके संयोजन के लिए एक तंत्र में बदला जा सकता है।
    • हां: "प्रभावशाली कार्य" एक ऐसा कार्य है जो एक वैचारिक परिणाम उत्पन्न करता है।

हास्केल में यह स्पष्ट करना सरल है (और यह वाक्य केवल आधा मजाक है)। "नहीं" मामले का एक उदाहरण कुछ इस तरह होगा:

double :: Num a => a -> IO a
double x = do
  putStrLn "I'm doubling some number"
  return (x*2)

इस उदाहरण में हम जो क्रिया करते हैं (रेखा को प्रिंट करते हैं "I'm doubling some number") का उसके xऔर परिणाम के बीच संबंधों पर कोई प्रभाव नहीं पड़ता है । इसका मतलब है कि हम इसे इस तरह से रिफ्लेक्टर कर सकते हैं ( Applicativeवर्ग और इसके *>ऑपरेटर का उपयोग करके ), जो दर्शाता है कि फ़ंक्शन और प्रभाव वास्तव में ऑर्थोगोनल हैं:

double :: Num a => a -> IO a
double x = action *> pure (function x)
  where
    -- The pure function 
    function x = x*2  
    -- The side effect
    action = putStrLn "I'm doubling some number"

तो इस मामले में मैं व्यक्तिगत रूप से कहूंगा कि यह ऐसा मामला है जहां आप शुद्ध कार्य कर सकते हैं। हास्केल प्रोग्रामिंग का एक बहुत कुछ इस बारे में है - प्रभावी कोड से शुद्ध भागों को कैसे निकालना है।

"हाँ" सॉर्ट का एक उदाहरण, जहाँ शुद्ध और प्रभावशाली भाग ऑर्थोगोनल नहीं हैं:

double :: Num a => a -> IO a
double x = do
  putStrLn ("I'm doubling the number " ++ show x)
  return (x*2)

अब, आपके द्वारा प्रिंट की जाने वाली स्ट्रिंग मूल्य के आधार पर निर्भर करती है xसमारोह हिस्सा (गुणा xदो से), तथापि, सब पर प्रभाव पर निर्भर नहीं करता इसलिए हम अभी भी इसे बाहर कारक कर सकते हैं:

logged :: (a -> b) -> (a -> IO x) -> IO b
logged function logger a = do
  logger a
  return (function a)

double x = logged function logger
  where function = (*2) 
        logger x putStrLn ("I'm doubling the number " ++ show x)

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

यह एक कारण है कि हास्केल अपने Monadवर्ग का इतने बड़े पैमाने पर उपयोग करता है । मोनाड्स (अन्य बातों के अलावा) इस तरह के विश्लेषण और रीफैक्टरिंग के लिए एक उपकरण हैं।


-2

साइड-इफेक्ट्स का कारण बनने वाले उद्देश्यों को अक्सर प्रभावी कहा जाता है । उदाहरण https://slpopejoy.github.io/posts/Effectful01.html


केवल व्यापक रूप से मान्यता प्राप्त शब्द का उल्लेख करने के लिए उत्तर दें और यह मतदान हो जाता है .... अज्ञानता आनंद है मुझे लगता है। ..
बेन हचिसन

"प्रभावशाली" एक ऐसा शब्द है जिसे उस पोस्ट के लेखक ने "साइड-इफेक्ट्स" होने का मतलब चुना है। वह खुद ऐसा कहता है।
रॉबर्ट हार्वे

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

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