साइड इफेक्ट्स रेफरेंसियल पारदर्शिता तोड़ते हैं, क्या वे कार्यात्मक भाषाओं के बिंदु के खिलाफ नहीं जाते हैं?कार्यात्मक भाषा मॉडल दुष्प्रभाव कैसे करते हैं?
उत्तर
दो तकनीकों कि पूरी तरह कार्यात्मक प्रोग्रामिंग भाषाओं द्वारा उपयोग किया जाता दुष्प्रभाव मॉडल करने के लिए कर रहे हैं:
1) एक दुनिया प्रकार है कि बाहरी राज्य है, जहां उस प्रकार के प्रत्येक मान प्रकार प्रणाली द्वारा गारंटीकृत है इस्तेमाल किया जा रहा का प्रतिनिधित्व करता है सिर्फ एक बार।
इस दृष्टिकोण का उपयोग करने वाली भाषा में print
और read
क्रमशः (string, world) -> world
और world -> (string, world)
प्रकार हो सकते हैं।
वे इस तरह इस्तेमाल किया जा सकता है:
let main w =
let w1 = print ("What's your name?", w) in
let (str, w2) = read w1 in
let w3 = print ("Your name is "^name, w2) in
w3
लेकिन यह पसंद नहीं:
let main w =
let w1 = print ("What's your name?", w) in
let (str, w2) = read w in
let w3 = print ("Your name is "^name, w2) in
w3
(क्योंकि डब्ल्यू दो बार प्रयोग किया जाता है) दुष्प्रभाव के साथ
सभी बिल्ट-इन कार्य एक विश्व मूल्य ले जाएगा और वापस ले जाएगा। चूंकि दुष्प्रभाव वाले सभी कार्य या तो अंतर्निहित हैं या साइड इफेक्ट्स के साथ अन्य कार्यों को कॉल करते हैं, इसका मतलब है कि साइड इफेक्ट्स वाले सभी कार्यों को दुनिया को लेने और वापस करने की आवश्यकता होती है।
इस तरह से एक ही तर्क के साथ दो बार दुष्प्रभावों के साथ एक समारोह को कॉल करना संभव नहीं है और संदर्भित पारदर्शिता का उल्लंघन नहीं किया जाता है।
2) एक आईओ मोनैड जहां साइड इफेक्ट्स के साथ सभी संचालन उस मोनैड के अंदर निष्पादित किए जाने हैं।
इस दृष्टिकोण के साथ साइड इफेक्ट्स के साथ सभी संचालनों में io something
होगा। उदाहरण के लिए print
टाइप string -> io unit
और read
के साथ एक फ़ंक्शन होगा io string
टाइप करें।
निष्पादन संचालन के मूल्य तक पहुंचने का एकमात्र तरीका आईओ ऑपरेशन के साथ एक तर्क के रूप में "मोनैडिक बाइंड" ऑपरेशन (जिसे >> उदाहरण के लिए हैकेल में कहा जाता है) का उपयोग करना होगा और एक फ़ंक्शन जो वर्णन करता है कि क्या करना है परिणामस्वरूप अन्य ऑपरेंड।
ऊपर से एक उदाहरण monadic आईओ के साथ इस प्रकार दिखाई देगा:
let main =
(print "What's your name?") >>=
(lambda() -> read >>=
(lambda name -> print ("Your name is "^name)))
आपका # 2 एक है आपके # 1 के लिए कार्यान्वयन विवरण। आईओ मोनैड स्वचालित रूप से आपके लिए उस विश्व स्थिति को ले जाएगा, जो आपके मोनैड उपयोगों के जो भी वाक्यविन्यास के पीछे आवश्यक है, पैकेजिंग और अनपॅकिंग कर रहा है। –
@ जस्ट: आपका मतलब है # 1 # 2 का कार्यान्वयन विवरण है, नहीं? लेकिन फिर यह कार्यान्वयन विस्तार नहीं है यदि यह प्रोग्रामर के संपर्क में आने वाला इंटरफ़ेस है। – sepp2k
हाँ, ठीक है। माफ़ कीजिये। # 1 # 2 का कार्यान्वयन विवरण है। –
मेरी समझ में सबसे अच्छा, यदि आप एक कार्यात्मक भाषा में दुष्प्रभाव चाहते हैं, तो आपको उन्हें स्पष्ट रूप से कोड करना होगा।
एक कार्यात्मक भाषा में कई विकल्प मैं संभाल करने के लिए उपलब्ध/हे हैं।
- शुद्ध न हों। कई कार्यात्मक भाषाएं पूरी तरह कार्यात्मक नहीं हैं। यह और अधिक है कि वे समर्थन कार्यात्मक प्रोग्रामिंग को लागू करने के बजाए समर्थन करते हैं। यह कार्यात्मक प्रोग्रामिंग में I/O की समस्या की समस्या का सबसे आम समाधान है। (उदाहरण: लिस्प, योजना, मानक एमएल, एरलांग, आदि)
- स्ट्रीम परिवर्तन। प्रारंभिक हास्केल I/O इस तरह से किया गया था। यदि आप अधिक जानकारी चाहते हैं तो विवरण के लिए नीचे दिए गए मेरे लिंक को देखें। (संकेत: आप शायद नहीं करते हैं।)
- निरंतरता उत्तीर्ण I/O (अन्य उत्तरों में उल्लिखित "विश्व-गुजरने वाला")। इस में आप अपने I/O के साथ डेटा के टोकन पास करते हैं जो संदर्भित अखंडता जीवित रखने के लिए आवश्यक "अलग-अलग मान" के रूप में कार्य करता है। यदि स्मृति सेवा करता है तो इसका उपयोग कई एमएल बोलियों द्वारा किया जाता है।
- उपरोक्त "निरंतरता" या "दुनिया" चीज को विभिन्न डेटा प्रकारों में लपेटा जा सकता है, सबसे अधिक (इन) प्रसिद्ध हास्केल में इस भूमिका में मोनैड का उपयोग किया जा रहा है। ध्यान दें कि यह, अनुमानतः, के तहत एक ही चीज़ है, लेकिन "दुनिया"/"निरंतरता" राज्य चर के ट्रैक रखने का टेडियम हटा दिया गया है।
a research dissertation है जो इनका विश्लेषण करता है।
कार्यात्मक I/O अनुसंधान का एक सतत क्षेत्र है और ऐसी अन्य भाषाएं हैं जो इस मुद्दे को रोचक और दिमागी तरीके से संबोधित करती हैं। कुछ शोध भाषाओं में Hoare logic का उपयोग किया जाता है। अन्य (जैसे Mercury) uniqueness typing का उपयोग करें। अभी भी अन्य (जैसे Clean) effect systems का उपयोग करें। इनमें से मेरे पास बुध के लिए बहुत ही सीमित, बहुत सीमित एक्सपोजर है, इसलिए मैं वास्तव में विवरणों पर टिप्पणी नहीं कर सकता। paper है जो विवरण की स्वच्छता I/O प्रणाली गहराई से है, हालांकि, यदि आप उस दिशा में रूचि रखते हैं।
http://stackoverflow.com/questions/2158050/what-are-the-alternative-of-monads-to-use-io-in-pure-functional-programming/2158637#2158637 –