2010-12-08 11 views
6

मैं कुछ एफ # कोड पर काम कर रहा था और मैं स्ट्रिंग्स के सेट से यादृच्छिक स्ट्रिंग वापस करने के लिए फ़ंक्शन पर काम कर रहा था।फ़ंक्शन से एक यादृच्छिक मूल्य लौटा रहा है एक साइड इफेक्ट?

open System 

let a = [|"a";"b";"c";"d"|] 

let rstring (arr:string[]) = 
    let r = new Random() 
    arr.[r.Next(0,3)] 

let resultstring = rstring a;; 

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

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


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

+0

हमेशा एक ही तर्क के लिए एक ही परिणाम लौटने का मतलब वास्तव में शुद्ध होना है, साइड इफेक्ट मुक्त नहीं है (साइड इफेक्ट के लिए परिभाषाएं पहले ही पोस्ट की गई हैं)। – delnan

+4

जब आप नाइट चुनना शुरू करते हैं, तो "साइड इफेक्ट्स" सॉफ्टवेयर में एक दिलचस्प अवधारणा नहीं है। संदर्भित पारदर्शिता और/या शुद्धता दिलचस्प/उपयोगी अवधारणाएं हैं, और यादृच्छिक/गैर-निर्धारित कार्य संदर्भित रूप से पारदर्शी नहीं हैं, और यही मायने रखता है। तो एक मायने में, ओपी गलत सवाल पूछ रहा है, या कम से कम एक दिलचस्प/उपयोगी नहीं है। शीर्षक के रूप में सवाल परिभाषाओं के बारे में nits चुनता है। सॉफ़्टवेयर के लिए महत्वपूर्ण बात यह है कि, यदि आपका फ़ंक्शन एक ही इनपुट के लिए अलग-अलग मान देता है, तो यह आपको बग की पूरी कक्षा में खुलता है। – Brian

+0

@ डेलनान - परिभाषा के अनुसार शुद्ध कार्य के लिए कोई दुष्प्रभाव नहीं है। सिर्फ इसलिए कि एक फ़ंक्शन हमेशा एक ही परिणाम देता है, यह शुद्ध नहीं करता है। –

उत्तर

13

हां।

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

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

+0

वास्तव में - हार्डवेयर से जुड़े एक यादृच्छिक संख्या जेनरेटर के बारे में क्या है जो परमाणु शोर पर नज़र रखता है। कार्यक्रम की स्थिति को बदलने की आवश्यकता क्यों होगी? – tvanfosson

+9

वायुमंडल की स्थिति अब कार्यक्रम राज्य का हिस्सा है। पूरी तरह से अभी भी हवा के कमरे में, शायद राज्य में बदलाव नहीं हो रहा है, लेकिन अब कमरे में हवा आपके कंप्यूटर प्रोग्राम द्वारा मॉडलिंग की गणना का हिस्सा है। – Brian

+0

ब्रायन के बिंदु पर विस्तार करने के लिए, कार्यक्रम की स्थिति उस मामले में बदल रही है, भले ही आप इसे स्पष्ट रूप से बदल नहीं रहे हैं। (इस बारे में सोचने से इस तरह मेरी मदद की, यह लगा कि यह दूसरों की मदद कर सकता है) – Guvante

7

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

संपादित करें:

मैं भी जोड़ देंगे कि एक समारोह हमेशा किसी दिए गए इनपुट के लिए एक ही मान देता है अगर यह idempotent कहा जाता है। इसके अलावा "साइड इफेक्ट" में बाहरी कार्य से पढ़ने वाले फ़ंक्शन शामिल हैं। उदाहरण के लिए:

int global = 0; 
int function() 
{ 
    return global; 
} 

दुष्प्रभाव हैं।

+0

पीआरएनजी के बारे में अच्छी बात - उस बारे में सोचा नहीं था। –

+1

"* यदि कोई फ़ंक्शन हमेशा दिए गए इनपुट के लिए समान मान देता है तो उसे idempotent * कहा जाता है * - मुझे उस लड़की * से नफरत है, लेकिन आपके पास * शुद्ध *, नहीं * idempotent * की परिभाषा है जो संदर्भित करती है किसी फ़ंक्शन 'f' पर जो सभी x के लिए संपत्ति' f (f (x)) == f (x) 'को संतुष्ट करता है। 'abs x = अगर x <0 तब -x else x' शुद्ध और idempotent है 'abs (abs (x)) == abs (x)'। समारोह 'succ x = x + 1' शुद्ध है लेकिन 'succ (succ (x)) के बाद idempotent नहीं है! = Succ (x)'। – Juliet

+0

@ जुलिएट - गणितीय रूप से यह सही है। कंप्यूटर विज्ञान में मैंने "idempotent" शब्द को 'f (f (x)) == f (x)' का अर्थ दिया है और इसका मतलब है "हमेशा दिए गए इनपुट के लिए समान मान देता है"। शायद इस शब्द का गलत इस्तेमाल किया जा रहा है। इसके अलावा, शुद्ध का बहुत कठोर अर्थ होता है - एक फ़ंक्शन हमेशा दिए गए इनपुट के लिए समान मान वापस कर सकता है लेकिन साइड इफेक्ट्स का कारण बनता है, जिससे इसे अशुद्ध किया जाता है। –

1

मुझे विश्वास नहीं है कि आपका उदाहरण दुष्प्रभाव माना जाएगा।

http://en.wikipedia.org/wiki/Side_effect_(computer_science)

+1

'यादृच्छिक() 'साइड इफेक्ट्स का कारण बनता है इसलिए rstring दुष्प्रभाव का कारण बनता है। –

+0

@Niki - यह इस विशिष्ट मामले में सच हो सकता है, लेकिन आम तौर पर केवल एक अनिश्चित मूल्य लौटने पर एक दुष्प्रभाव नहीं होता है। – tvanfosson

+0

@Niki रैंडम() के दुष्प्रभाव क्या हैं? –

3

ठीक एक समारोह गैर नियत होने के लिए है। यह दुष्प्रभाव नहीं है। एक साइड इफेक्ट होगा यदि यह किसी मूल्य को वापस करने के अलावा प्रोग्राम की स्थिति को किसी भी तरह बदल देता है। मैं कहूंगा कि दोनों दुष्प्रभाव और गैर-निर्धारणवाद ऐसे तरीके हैं जो कार्यात्मक प्रोग्रामिंग में कार्य गणितीय कार्यों से भिन्न होते हैं।

+0

ठीक है, यह आरएनजी के राज्य को बदलता है। यद्यपि वह दुष्प्रभाव अकेले शुद्धता को प्रभावित नहीं करता है (नतीजे में गैर-शुद्ध यादृच्छिक संख्या को शामिल करता है)। – delnan

+0

@ डेलनान - इस प्रश्न के साथ उदाहरण को भ्रमित न करें। प्रश्न यह है कि गैर-निर्धारणा एक दुष्प्रभाव के समान होती है। तथ्य यह है कि उदाहरण दोनों गैर-निर्णायक हैं और इसका दुष्प्रभाव यह नहीं दर्शाता है कि गैर-निर्धारणा एक दुष्प्रभाव है। – tvanfosson

+0

यहां दो प्रश्न पूछे जा रहे हैं। शीर्षक प्रश्न: "फ़ंक्शन से एक यादृच्छिक मूल्य लौटा रहा है एक साइड इफेक्ट?" "हां" का एक विशिष्ट उत्तर है। अधिक सामान्य प्रश्न: "क्या गैर-निर्धारणा एक साइड इफेक्ट है?" जैसा कि आपने बताया है इसका एक अलग उत्तर है। हालांकि मैं एक गैर-निर्धारिती कार्य के उदाहरण के बारे में नहीं सोच सकता जिसका दुष्प्रभाव नहीं है। –

2

यादृच्छिक जनरेटर के कार्यान्वयन विवरण की उपेक्षा (जो अभ्यास में साइड इफेक्ट्स की आवश्यकता होती है, और सिद्धांत में यह नहीं है), तो यह फ़ंक्शन दुष्प्रभाव मुक्त है लेकिन शुद्ध नहीं है।

मूल रूप से फ़ंक्शन कॉल को ऑरैकल मशीन होने की कल्पना करें जो पूरी तरह से कुछ भी नहीं पर यादृच्छिक संख्या देता है। कहीं ऐसा सबूत है जो कहता है कि आप ऐसा नहीं कर सकते हैं, लेकिन उस समय के लिए बस कल्पना की जा रही है।

यदि आप इस ओरेकल मशीन के रूप में एक पीआरएनजी फ़ंक्शन का इलाज करते हैं जो आपको हर बार यादृच्छिक संख्या देता है, तो यह दुष्प्रभाव मुक्त और अशुद्ध है, और फ़ंक्शन उसे प्राप्त करता है।

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

एक नरम पक्ष प्रभाव का उत्कृष्ट उदाहरण प्रवेश करने की है, के बाद से कार्यक्रम आम तौर पर अपने लॉग्स का निरीक्षण नहीं करते हैं और परिवर्तन इस पर आधारित व्यवहार।

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

http://fsharpcode.blogspot.com/2008/12/f-state-monad-type-state-state-state-of.html

मूल रूप से है कि लेने के लिए, आप एक यादृच्छिक संख्या जनरेटर और 'एक एक पूर्णांक, और फिर अपने नियंत्रण प्रवाह एक भी कार्य करने के लिए अशुद्धता अलग और अनुक्रमण पर एक कठिन आदेश बनाता है राज्य हैं।

एफ # में ऐसा करने का कोई मतलब नहीं है, क्योंकि अशुद्ध कार्य वास्तव में समस्याएं नहीं पैदा करते हैं (दूसरी तरफ साइड इफेक्ट्स के साथ काम करते हैं)।

बेशक मोनड अशुद्ध है, लेकिन यह अशुद्धता को अच्छी तरह से अलग करता है।

संबंधित मुद्दे