हाल ही में, मैंने हास्केल सीखना शुरू कर दिया क्योंकि मैं कार्यात्मक प्रोग्रामिंग पर अपने ज्ञान को व्यापक बनाना चाहता था और मुझे कहना होगा कि मैं वास्तव में अब तक इसे प्यार कर रहा हूं। वर्तमान में मैं जिस संसाधन का उपयोग कर रहा हूं, वह प्लुरलसाइट पर 'हास्केल फंडामेंटल पार्ट 1' है। दुर्भाग्य से मुझे निम्नलिखित कोड के बारे में व्याख्याता के एक विशेष उद्धरण को समझने में कुछ कठिनाई हो रही है और उम्मीद कर रहा था कि आप लोग इस विषय पर कुछ प्रकाश डाल सकते हैं।
आचार संहिता
helloWorld :: IO ()
helloWorld = putStrLn "Hello World"
main :: IO ()
main = do
helloWorld
helloWorld
helloWorld
उद्धरण
यदि आपके पास एक ही ब्लॉक में कई बार एक ही IO कार्रवाई है, तो इसे कई बार चलाया जाएगा। इसलिए यह कार्यक्रम तीन बार 'हेलो वर्ल्ड' स्ट्रिंग को प्रिंट करता है। यह उदाहरण वर्णन करने में मदद करता है कि putStrLnसाइड इफेक्ट्स के साथ एक फ़ंक्शन नहीं है। हम चर putStrLnको परिभाषित करने के लिए एक बार फ़ंक्शन कहते हैं helloWorld। यदि putStrLnस्ट्रिंग को प्रिंट करने का कोई साइड इफेक्ट होता है, तो यह केवल एक बार प्रिंट करेगा और helloWorldमुख्य डू-ब्लॉक में दोहराए गए चर का कोई प्रभाव नहीं होगा।
अधिकांश अन्य प्रोग्रामिंग भाषाओं में, इस तरह का एक कार्यक्रम केवल एक बार 'हैलो वर्ल्ड' को प्रिंट करेगा, क्योंकि मुद्रण तब होगा जब putStrLnफ़ंक्शन को बुलाया जाएगा। यह सूक्ष्म अंतर अक्सर शुरुआती लोगों की यात्रा करेगा, इसलिए इस बारे में थोड़ा सोचें, और यह सुनिश्चित करें कि आप समझें कि यह कार्यक्रम 'हैलो वर्ल्ड' को तीन बार प्रिंट क्यों करता है और क्यों यह केवल एक बार प्रिंट करेगा यदि putStrLnफ़ंक्शन ने साइड इफेक्ट के रूप में मुद्रण किया।
जो मुझे समझ नहीं आ रहा है
मेरे लिए यह लगभग स्वाभाविक है कि स्ट्रिंग 'हैलो वर्ल्ड' तीन बार छपी है। मैं helloWorldचर (या फ़ंक्शन?) को कॉलबैक के एक प्रकार के रूप में देखता हूं जो बाद में आह्वान किया जाता है। जो मुझे समझ नहीं आ रहा है, putStrLnउसका साइड इफ़ेक्ट कैसे हुआ , इसका परिणाम यह होगा कि स्ट्रिंग केवल एक बार छपी होगी। या क्यों यह केवल एक बार अन्य प्रोग्रामिंग भाषाओं में मुद्रित किया जाएगा।
चलो सी # कोड में कहते हैं, मुझे लगता है कि यह इस तरह दिखेगा:
सी # (फिडल)
using System;
public class Program
{
public static void HelloWorld()
{
Console.WriteLine("Hello World");
}
public static void Main()
{
HelloWorld();
HelloWorld();
HelloWorld();
}
}
मुझे यकीन है कि मैं कुछ सरल या गलत तरीके से उनकी शब्दावली की अनदेखी कर रहा हूं। किसी भी तरह की सहायता का स्वागत किया जाएगा।
संपादित करें:
आपके जवाबों के लिए आप सभी का धन्यवाद! आपके उत्तरों से मुझे इन अवधारणाओं की बेहतर समझ प्राप्त करने में मदद मिली। मुझे नहीं लगता कि यह पूरी तरह से अभी तक क्लिक किया गया है, लेकिन मैं भविष्य में इस विषय पर फिर से विचार करूंगा, धन्यवाद!
putStrLn एक साइड इफेक्ट नहीं है; यह केवल एक IO कार्रवाई लौटाता है, तर्क के लिए एक ही IO क्रिया "Hello World"चाहे आप कितनी बार कॉल करें putStrLn।
helloworldतो एक कार्रवाई नहीं होगी जो प्रिंट करती है Hello world; यह द्वारा दिए गए मान होगा putStrLn के बाद यह मुद्रित Hello World(यानी, ())।
helloWorld = Console.WriteLine("Hello World");। आप बस फंक्शन Console.WriteLine("Hello World");में सम्मिलित किए जाने वाले HelloWorldफ़ंक्शन को सम्मिलित करते हैं HelloWorld। अब सोचिए कि क्या helloWorld = putStrLn "Hello World"बनाता है helloWorld। यह एक IO सन्यासी को सौंपा जाता है जिसमें शामिल होता है ()। एक बार जब आप इसे बांधते हैं तो >>=यह केवल गतिविधि (कुछ मुद्रण) करता है और आपको ()बाइंड ऑपरेटर के दाईं ओर देगा।
helloWorldC # में किसी फ़ील्ड या वैरिएबल की तरह स्थिर रहने के बारे में सोचें । कोई पैरामीटर नहीं है जिसे लागू किया जा रहा हैhelloWorld।