हम सभी जानते हैं (या पता होना चाहिए) कि हास्केल डिफ़ॉल्ट रूप से आलसी है। किसी भी चीज का मूल्यांकन तब तक नहीं किया जाता जब तक उसका मूल्यांकन न किया जाए। तो कुछ का मूल्यांकन कब किया जाना चाहिए? ऐसे बिंदु हैं जहां हास्केल को सख्त होना चाहिए। मैं इन "कठोरता बिंदुओं" को कहता हूं, हालांकि यह विशेष शब्द उतना व्यापक नहीं है जितना मैंने सोचा था। मेरे हिसाब से:
हास्केल में कटौती (या मूल्यांकन) केवल कठोरता बिंदुओं पर होती है।
तो सवाल यह है: क्या, ठीक है , हास्केल की सख्ती अंक हैं? मेरा अंतर्ज्ञान कहता है कि main
, seq
/ बैंग पैटर्न, पैटर्न मिलान, और किसी भी IO
क्रिया के माध्यम से प्रदर्शन main
प्राथमिक कठोरता बिंदु हैं, लेकिन मुझे वास्तव में नहीं पता कि मैं क्यों जानता हूं।
(इसके अलावा, अगर वे "कठोरता अंक", कहा जाता है नहीं कर रहे हैं क्या कर रहे हैं वे कहा जाता है?)
मैं कल्पना करता हूं कि एक अच्छे उत्तर में WHNF वगैरह के बारे में कुछ चर्चा शामिल होगी। मैं यह भी कल्पना करता हूं कि यह लंबोदा पथरी पर छू सकता है।
संपादित करें: इस प्रश्न के बारे में अतिरिक्त विचार।
जैसा कि मैंने इस प्रश्न पर प्रतिबिंबित किया है, मुझे लगता है कि यह एक कठोरता बिंदु की परिभाषा में कुछ जोड़ना स्पष्ट होगा। सख़्ती अंक अलग हो सकता है संदर्भों और अलग गहराई (या कठोरता)। अपनी परिभाषा में वापस आते हुए कि "हास्केल में कमी केवल सख्ती के बिंदुओं पर होती है", हम इस खंड में उस परिभाषा को जोड़ते हैं: "एक कठोरता बिंदु केवल तभी ट्रिगर होता है जब इसके आसपास के संदर्भ का मूल्यांकन या कम किया जाता है।"
इसलिए, मुझे उस तरह के उत्तर पर आरंभ करने का प्रयास करना चाहिए जो मैं चाहता हूं। main
एक सख्त बिंदु है। इसे विशेष रूप से इसके संदर्भ के प्राथमिक सख्ती बिंदु के रूप में निर्दिष्ट किया गया है: कार्यक्रम। जब कार्यक्रम ( main
संदर्भ) का मूल्यांकन किया जाता है, तो मुख्य की कठोरता बिंदु सक्रिय हो जाती है। मुख्य की गहराई अधिकतम है: इसका पूरी तरह से मूल्यांकन किया जाना चाहिए। मुख्य आमतौर पर आईओ कार्यों, जो भी कठोरता अंक, जिसका संदर्भ है से बना है main
।
अब आप कोशिश करते हैं: seq
इन शब्दों में चर्चा और पैटर्न मिलान। फ़ंक्शन एप्लिकेशन की बारीकियों को समझाएं: यह कैसे सख्त है? यह कैसे नहीं है? किस बारे में deepseq
? let
और case
बयान? unsafePerformIO
? Debug.Trace
? शीर्ष स्तर की परिभाषाएँ? सख्त डेटा प्रकार? बैंग पैटर्न? आदि। इन मदों में से कितने को सिर्फ seq या पैटर्न मिलान के संदर्भ में वर्णित किया जा सकता है?
seq
और पैटर्न मिलान पर्याप्त हैं, बाकी उन के संदर्भ में परिभाषित हैं। मुझे लगता है कि पैटर्न का मिलानIO
क्रियाओं की रीढ़-कठोरता का आश्वासन देता है , उदाहरण के लिए।