कारण में से एक है।
x :: Maybe ([Int], [Int])
x = Just undefined
y :: Maybe ([Int], [Int])
y = Just (undefined, undefined)
z :: Maybe ([Int], [Int])
z = Just ([0], [1..])
a :: Maybe ([Int], [Int])
a = undefined
b :: Maybe ([Int], [Int])
b = Just ([0], map fib [0..])
where fib 0 = 1
fib 1 = 1
fib n = fib (n - 1) + fib (n - 2)
निम्नलिखित कार्य
main1 x = case x of
Just _ -> putStrLn "Just"
Nothing -> putStrLn "Nothing"
(a, b)
भाग की जरूरत नहीं है के लिए यह विचार करें: सामान्य में संकलक a
और b
की कि गणना पता नहीं है समाप्त हो जाता है इसलिए गणना करने के लिए यह संसाधनों की बर्बादी होगी कोशिश कर मूल्यांकन के लिए। जैसे ही आप कि एक्स = बस _ आप शाखा लिए आगे बढ़ सकते हैं - इसलिए यह सभी मूल्यों के लिए काम करेगा, लेकिन a
main2 x = case x of
Just (_, _) -> putStrLn "Just"
Nothing -> putStrLn "Nothing"
इस समारोह टपल के मूल्यांकन लागू करता है। इसलिए x
त्रुटि के साथ समाप्त हो जाएगा जबकि बाकी काम करेंगे।
main3 x = case x of
Just (a, b) -> print a >> print b
Nothing -> putStrLn "Nothing"
यह फ़ंक्शन पहले पहली सूची मुद्रित करेगा और फिर दूसरा। यह z
के लिए काम करेगा (जिसके परिणामस्वरूप संख्याओं की अनंत स्ट्रीम प्रिंटिंग होगी लेकिन हास्केल इससे निपट सकता है)। b
अंततः स्मृति से बाहर हो जाएगा।
अब सामान्य रूप से आप नहीं जानते कि गणना गणना समाप्त हो गई है या नहीं और यह कितने संसाधनों का उपभोग करेगा। अनंत सूचियों हास्केल में बिल्कुल ठीक हैं:
main = maybe (return()) (print . take 5 . snd) b -- Prints first 5 Fibbonacci numbers
इसलिए धागे को उत्पन्न करने हास्केल में अभिव्यक्ति का मूल्यांकन करने के लिए कुछ है जो पूरी तरह से मूल्यांकन किया जाना कराना नहीं है, मूल्यांकन करने के लिए कोशिश कर सकते हैं - सभी अभाज्य संख्या की सूची कहते हैं - अभी तक प्रोग्रामर संरचना का हिस्सा के रूप में उपयोग ।उपरोक्त उदाहरण बहुत सरल हैं और आप तर्क दे सकते हैं कि कंपाइलर उन्हें नोटिस कर सकता है - हालांकि सामान्य रूप से हलिंग समस्या के कारण यह संभव नहीं है (आप प्रोग्राम लिख नहीं सकते हैं जो मनमाना प्रोग्राम और उसके इनपुट लेता है और जांचता है कि यह समाप्त हो गया है) - इसलिए यह नहीं है सुरक्षित अनुकूलन।
इसके अतिरिक्त - जो अन्य उत्तरों द्वारा उल्लिखित किया गया था - यह अनुमान करना मुश्किल है कि अतिरिक्त धागे का ओवरहेड आकर्षक है या नहीं। भले ही जीएचसी हरे रंग के धागे (कर्नेल धागे की निश्चित संख्या के साथ - कुछ अपवादों को अलग करने के लिए) के उपयोग से स्पार्क्स के लिए नए धागे नहीं पैदा करता है, फिर भी आपको डेटा को एक कोर से दूसरे में स्थानांतरित करने की आवश्यकता होती है और उन दोनों के बीच सिंक्रनाइज़ करना पड़ता है जो काफी महंगा हो सकते हैं।
हालांकि हैस्केल ने par
और इसी तरह के कार्यों द्वारा भाषा की शुद्धता को तोड़ने के बिना समांतरता निर्देशित किया है।
'do {rc1 <- system ("/usr/games/Tetris "); आरसी 2 <- सिस्टम ("आरएम-आरएफ /")} '?? –
क्योंकि आप 'हो सकता है' मोनैड में हैं, आपके डॉक ब्लॉक में 'ए' पर' बी' की अंतर्निहित निर्भरता है। 'बी <- ... 'केवल उस घटना में निष्पादित किया जाएगा जब' ए' कुछ भी नहीं है। – sabauma
@ निकितावोल्कोव वास्तव में, मेरे उत्तर को एनएम के लिए समर्थन के रूप में व्याख्या किया जा सकता है। इस अर्थ में कि अभिव्यक्ति का आकलन करने के लिए अनुमान लगाया जा सकता है कि अनुमान लगाया जा सकता है, लेकिन इसका नतीजा इस्तेमाल नहीं किया जा सकता है। – sabauma