मान लीजिए कि आपके पास एक अच्छी अपूर्व परिभाषा है और आप इसे हास्केल में डेटा प्रकार के रूप में परिभाषित करना चाहते हैं। हालांकि, आपकी अपरिवर्तनीय परिभाषा इस तरह के रूप में (कई अपरिवर्तनीय परिभाषाएं हैं) है कि उत्पन्न नियमों को उनके 'प्रीमिसीज़' की एक निश्चित संरचना की आवश्यकता होती है। , डेटा प्रकारों को नियंत्रित करना
- अगर
x
एक और भी पूर्णांक, तोT x
एक हथियार है है अगरx
, एक विषम पूर्णांक है तोS x
एक हथियार है: उदाहरण के लिए, मान लीजिए हम निम्नलिखित परिभाषा है।
मैं इस को परिभाषित करने के हास्केल में डेटा प्रकार (एक) के रूप में चाहते हैं, मैं
data Weapon = T Int | S Int
जाहिर की तरह कुछ लिखते थे, इस के रूप में आप अब T 5
और S 4
उत्पन्न कर सकते हैं काम नहीं करेगा, के लिए उदाहरण। क्या रचनाकार तर्कों पर प्रतिबंधों को पारित करने का कोई प्राकृतिक तरीका है, ताकि मैं उपरोक्त कोड के समान कुछ लिख सकूं जो सही परिभाषा देगी? , उपयोगकर्ताओं को स्पष्ट रूप से T
और S
बनाने के लिए सक्षम नहीं होंगे जब YourModule
आयात करने
module YourModule (Weapon, smartConstruct) where
data Weapon = T Int | S Int
smartConstruct :: Int -> Weapon
smartConstruct x
| even x = T x
| otherwise = S x
अब, लेकिन केवल के साथ:
स्मार्ट कन्स्ट्रक्टर, ज्यादातर।'टी' और' एस' का उपयोग करके सीधे फोर्बिड करें, और 'न्यूटी' और' नए एस 'फ़ंक्शंस बनाएं जो पारित संख्याओं को सत्यापित करते हैं। –