मैं कहूंगा कि पूछने के लिए सबसे अच्छी बात यह नहीं है कि हम इसे कैसे कहेंगे, लेकिन हम इस तरह के कोड का विश्लेषण कैसे करेंगे । और इस तरह के विश्लेषण में मेरा पहला महत्वपूर्ण सवाल होगा:
- क्या साइड इफेक्ट फ़ंक्शन के तर्क पर निर्भर करता है, या साइड इफेक्ट पर परिणाम?
- नहीं: "प्रभावी कार्य" को एक शुद्ध कार्य, एक प्रभावी कार्रवाई और उनके संयोजन के लिए एक तंत्र में बदला जा सकता है।
- हां: "प्रभावशाली कार्य" एक ऐसा कार्य है जो एक वैचारिक परिणाम उत्पन्न करता है।
हास्केल में यह स्पष्ट करना सरल है (और यह वाक्य केवल आधा मजाक है)। "नहीं" मामले का एक उदाहरण कुछ इस तरह होगा:
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
वर्ग का इतने बड़े पैमाने पर उपयोग करता है । मोनाड्स (अन्य बातों के अलावा) इस तरह के विश्लेषण और रीफैक्टरिंग के लिए एक उपकरण हैं।