यह एक सख्त घोषणा है। मूल रूप से, इसका अर्थ है कि जब डेटा संरचना मान बनाया जाता है, तो इसका मूल्यांकन "कमजोर सिर सामान्य रूप" के रूप में किया जाना चाहिए। आइए एक उदाहरण देखें, ताकि हम यह देख सकें कि इसका क्या अर्थ है:
data Foo = Foo Int Int !Int !(Maybe Int)
f = Foo (2+2) (3+3) (4+4) (Just (5+5))
f
उपरोक्त फ़ंक्शन , जब मूल्यांकन किया जाता है, तो एक "थंक" लौटाएगा: अर्थात, इसके मूल्य का पता लगाने के लिए कोड। उस बिंदु पर, एक फू भी अभी तक मौजूद नहीं है, बस कोड।
लेकिन किसी बिंदु पर कोई इसके अंदर देखने की कोशिश कर सकता है, शायद एक पैटर्न मैच के माध्यम से:
case f of
Foo 0 _ _ _ -> "first arg is zero"
_ -> "first arge is something else"
यह वह करने के लिए पर्याप्त कोड निष्पादित करने जा रहा है जिसे इसकी आवश्यकता है, और अधिक नहीं। तो यह चार मानकों के साथ एक फू पैदा करेगा (क्योंकि आप इसके बिना इसे अंदर नहीं देख सकते हैं)। पहला, चूंकि हम इसका परीक्षण कर रहे हैं, हमें सभी तरह से मूल्यांकन करने की आवश्यकता है 4
, जहां हमें एहसास होता है कि यह मेल नहीं खाता है।
दूसरे का मूल्यांकन करने की आवश्यकता नहीं है, क्योंकि हम इसका परीक्षण नहीं कर रहे हैं। इस प्रकार, 6
उस मेमोरी लोकेशन में स्टोर होने के बजाय , हम कोड को संभवतया मूल्यांकन के लिए स्टोर करेंगे (3+3)
। अगर कोई इसे देखता है तो यह केवल 6 में बदल जाएगा।
तीसरा पैरामीटर, हालांकि, इसके !
सामने एक है, इसलिए इसका कड़ाई से मूल्यांकन किया जाता है: (4+4)
निष्पादित किया जाता है, और 8
उस मेमोरी स्थान में संग्रहीत किया जाता है।
चौथे पैरामीटर का भी कड़ाई से मूल्यांकन किया जाता है। लेकिन यहाँ जहाँ यह थोड़ा मुश्किल हो जाता है: हम पूरी तरह से मूल्यांकन नहीं कर रहे हैं, लेकिन केवल कमजोर सामान्य रूप से। इसका मतलब यह है कि हम यह पता लगाते हैं कि यह कुछ है, Nothing
या इसे Just
स्टोर करें, लेकिन हम आगे नहीं बढ़ते हैं। इसका मतलब है कि हम स्टोर नहीं करते हैं, Just 10
लेकिन वास्तव Just (5+5)
में ठग को निर्विवाद रूप से छोड़ देते हैं। यह जानना महत्वपूर्ण है, हालांकि मुझे लगता है कि इसके सभी निहितार्थ इस प्रश्न के दायरे से परे हैं।
यदि आप BangPatterns
भाषा एक्सटेंशन को सक्षम करते हैं , तो आप उसी तरह से फ़ंक्शन तर्कों को एनोटेट कर सकते हैं:
f x !y = x*y
f (1+1) (2+2)
ठग वापस आ जाएगा (1+1)*4
।