यह वह जगह है उदाहरण है कि मुझे आश्वस्त हास्केल जानने के लिए (और लड़का हूँ मुझे खुशी है कि मैंने किया था)।
-- program to copy a file --
import System.Environment
main = do
--read command-line arguments
[file1, file2] <- getArgs
--copy file contents
str <- readFile file1
writeFile file2 str
ठीक है, यह एक छोटा, पठनीय कार्यक्रम है। इस लिहाज से यह C प्रोग्राम से बेहतर है। लेकिन यह एक समान संरचना के साथ एक पायथन कार्यक्रम से इतना अलग (कह) कैसे है?
इसका उत्तर आलसी मूल्यांकन है। अधिकांश भाषाओं (यहां तक कि कुछ कार्यात्मक वाले) में, ऊपर दिए गए एक प्रोग्राम की तरह पूरी फ़ाइल को मेमोरी में लोड किया जाएगा, और फिर एक नए नाम के तहत फिर से लिखा जाएगा।
हास्केल "आलसी" है। यह चीजों की तब तक गणना नहीं करता है जब तक कि उसे जरूरत न हो, और विस्तार से उन चीजों की गणना नहीं करता है जिनकी उसे कभी आवश्यकता नहीं है। उदाहरण के लिए, यदि आप writeFile
लाइन को हटाते हैं , तो हास्केल पहली बार में फ़ाइल से कुछ भी पढ़ने से परेशान नहीं होगा।
जैसा कि यह है, हास्केल को पता चलता है कि इस writeFile
पर निर्भर करता है readFile
, और इसलिए इस डेटा पथ को अनुकूलित करने में सक्षम है।
हालांकि परिणाम संकलक-निर्भर होते हैं, जब आप उपरोक्त प्रोग्राम चलाते हैं तो आमतौर पर क्या होता है: यह प्रोग्राम पहली फाइल का एक ब्लॉक (8KB) पढ़ता है, फिर दूसरी फाइल पर लिखता है, फिर पहले से दूसरे ब्लॉक को पढ़ता है। फ़ाइल, और इसे दूसरी फ़ाइल पर लिखता है, और इसी तरह। (इस strace
पर चलने की कोशिश करें !)
... जो एक फ़ाइल प्रतिलिपि के कुशल सी कार्यान्वयन क्या होगा की तरह एक बहुत कुछ दिखता है।
तो, हास्केल आपको बहुत अधिक प्रदर्शन का त्याग किए बिना - अक्सर कॉम्पैक्ट, पठनीय कार्यक्रम लिखने देता है।
एक और बात जो मुझे जोड़नी चाहिए वह यह है कि हास्केल बस छोटी गाड़ी के कार्यक्रमों को लिखना मुश्किल बना देता है। आश्चर्यजनक प्रकार प्रणाली, साइड-इफेक्ट्स की कमी, और निश्चित रूप से हास्केल कोड की कॉम्पैक्टनेस कम से कम तीन कारणों से बग को कम करती है:
बेहतर कार्यक्रम डिजाइन। कम जटिलता कम तर्क त्रुटियों की ओर जाता है।
कॉम्पैक्ट कोड। बग के लिए बहुत कम लाइनें मौजूद हैं।
संकलित त्रुटियाँ। कीड़े के बहुत सारे अभी मान्य हास्केल नहीं हैं ।
हास्केल हर किसी के लिए नहीं है। लेकिन सभी को इसे आज़माना चाहिए।