अभी तक एक और एफपी + साइड इफेक्ट्स प्रश्न के लिए खेद है, लेकिन मैं एक मौजूदा एक नहीं ढूंढ सका, जो मेरे लिए इसका उत्तर देता है।
कार्यात्मक प्रोग्रामिंग की मेरी (सीमित) समझ यह है कि राज्य / साइड इफेक्ट्स को कम से कम किया जाना चाहिए और स्टेटलेस लॉजिक से अलग रखा जाना चाहिए।
मैं इसके लिए हास्केल के दृष्टिकोण को भी इकट्ठा करता हूं, आईओ सनक, एक कंटेनर में राज्य के कार्यों को लपेटकर प्राप्त करता है, बाद में निष्पादन के लिए, कार्यक्रम के दायरे से बाहर माना जाता है।
मैं इस पैटर्न को समझने की कोशिश कर रहा हूं, लेकिन वास्तव में यह निर्धारित करने के लिए कि क्या इसे पायथन प्रोजेक्ट में उपयोग करना है, इसलिए यदि हास्सेल स्पेसिफिकेशन से बचना चाहते हैं।
आने वाला क्रूड उदाहरण।
अगर मेरा प्रोग्राम XML फाइल को JSON फाइल में बदलता है:
def main():
xml_data = read_file('input.xml') # impure
json_data = convert(xml_data) # pure
write_file('output.json', json_data) # impure
ऐसा करने के लिए प्रभावी रूप से IO मोनाद का दृष्टिकोण नहीं है:
steps = list(
read_file,
convert,
write_file,
)
तब वास्तव में उन कदमों को न बुलाकर जिम्मेदारी से खुद को दूर कर लेना , लेकिन दुभाषिए को ऐसा करने देना?
या कोई और तरीका रखें, यह लिखने जैसा है:
def main(): # pure
def inner(): # impure
xml_data = read_file('input.xml')
json_data = convert(xml_data)
write_file('output.json', json_data)
return inner
फिर किसी और से कॉल करने की अपेक्षा करना inner()
और कहना कि आपका काम पूरा हो गया main()
है क्योंकि वह शुद्ध है।
पूरा कार्यक्रम मूल रूप से IO मोनद में निहित है।
जब कोड वास्तव में निष्पादित होता है , तो फ़ाइल को पढ़ने के बाद सब कुछ उस फ़ाइल की स्थिति पर निर्भर करता है, इसलिए अभी भी समान राज्य से संबंधित कीड़े से पीड़ित होगा जैसा कि अनिवार्य कार्यान्वयन, इसलिए क्या आपने वास्तव में कुछ भी प्राप्त किया है, एक प्रोग्रामर के रूप में जो इसे बनाए रखेगा?
मैं राज्य के व्यवहार को कम करने और अलग करने के लाभ की पूरी तरह से सराहना करता हूं , जो वास्तव में है कि मैंने इस तरह के अनिवार्य संस्करण को संरचित किया है: इनपुट इकट्ठा करें, शुद्ध सामान करें, आउटपुट को थूक दें। उम्मीद है कि convert()
पूरी तरह से शुद्ध हो सकता है और cachability, threadsafety, आदि का लाभ उठा सकता है।
मैं यह भी सराहना करता हूं कि विशेष रूप से तुलनीय प्रकारों पर काम करने वाली पाइपलाइनों में मोनैडिक प्रकार उपयोगी हो सकते हैं, लेकिन यह नहीं देखते हैं कि आईओ को जब तक इस तरह की पाइप लाइन में पहले से ही मोनड का उपयोग नहीं करना चाहिए।
क्या आईओ मोनाड पैटर्न लाता है, जो मुझे याद आ रहा है साइड इफेक्ट से निपटने के लिए कुछ अतिरिक्त लाभ है?
main
हास्केल कार्यक्रम का प्रकार है IO ()
- एक IO क्रिया। यह वास्तव में एक कार्य नहीं है; यह एक मूल्य है । आपका पूरा कार्यक्रम एक शुद्ध मूल्य है जिसमें निर्देश हैं जो भाषा रनटाइम को बताता है कि उसे क्या करना चाहिए। सभी अशुद्ध सामान (वास्तव में IO क्रिया करना) आपके कार्यक्रम के दायरे से बाहर है।
read_file
) का परिणाम लेते हैं और इसे अगले एक ( write_file
) के तर्क के रूप में उपयोग करते हैं । यदि आपके पास केवल स्वतंत्र कार्यों का क्रम था, तो आपको मोनाड की आवश्यकता नहीं होगी।