किसी भी चाल जब enums पर बेतुका विधेय के सबूत के निर्माण बॉयलरप्लेट से छुटकारा पाने के लिए?
data WineStock : Fruit -> Type where
CanonicalWine : WineStock Grape
CiderIsWineToo : WineStock Apple
जो Banana
, Orange
, Lemon
और दूसरों के लिए नहीं रखता है चलो कहते हैं कि मैं
data Fruit = Apple | Banana | Grape | Orange | Lemon | {- many others -}
और उस प्रकार पर एक विधेय करते हैं,।
यह can be said है कि यह WineStock
को Fruit
पर एक अनुमान के रूप में परिभाषित करता है; WineStock Grape
सच है (क्योंकि हम उस प्रकार के मूल्य/सबूत का निर्माण कर सकते हैं: CanonicalWine
) WineStock Apple
के रूप में भी है, लेकिन WineStock Banana
झूठी है, क्योंकि उस प्रकार किसी भी मान/सबूत का निवास नहीं है।
फिर, मैं कैसे प्रभावी ढंग से Not (WineStock Banana)
, Not (WineStock Lemon)
, आदि का उपयोग के बारे में जा सकते हैं? ऐसा लगता है कि Grape
और Apple
के अलावा प्रत्येक Fruit
निर्माता के लिए, मैं impossible
रों का पूरा मदद कर सकते हैं नहीं है, लेकिन WineStock
पर एक मामले विभाजन ऊपर कोड करने के लिए, कहीं है,:
instance Uninhabited (WineStock Banana) where
uninhabited CanonicalWine impossible
uninhabited CiderIsWineToo impossible
instance Uninhabited (WineStock Lemon) where
uninhabited CanonicalWine impossible
uninhabited CiderIsWineToo impossible
instance Uninhabited (WineStock Orange) where
uninhabited CanonicalWine impossible
uninhabited CiderIsWineToo impossible
ध्यान दें कि:
- कोड दोहराव है, जब विधेय परिभाषा बढ़ता
- एलओसी विस्फोट हो जाएगा, और अधिक कंस्ट्रक्टर्स प्राप्त कर रहा। बस
Not (Sweet Lemon)
सबूत कल्पना, यह मानते हुए वहाँFruit
परिभाषा में कई मिठाई विकल्प हैं।
तो, इस तरह से संतोषजनक प्रतीत नहीं होता है, लगभग अव्यवहारिक।
वहाँ और अधिक सुरुचिपूर्ण दृष्टिकोण हैं?
पुराने हास्केल मुहावरे में से कई निर्भर रूप से टाइप किए गए सिस्टम में नहीं बदलते हैं। प्रकार के स्तर पर "गैरकानूनी राज्यों को निर्विवाद बनाना" भी है: मुझे नहीं लगता कि आपको उन असंभव प्रकारों को भी बनाने में सक्षम होना चाहिए। मैं शायद इस उदाहरण को (कुछ मोटे तौर पर पसंद करता हूं) के रूप में तैयार करता हूं जो कि एक प्रकार का फल है जो शराब 'डेटा वाइनफ्रूट = अंगूर बना सकता है। ऐप्पल 'और अन्य फलों' डेटा फल = वाइनफ्रूट वाइनफ्रूट | केले | ऑरेंज | Lemon' –
@BenjaminHodgson, कि दृष्टिकोण अलग गिर करने के लिए जब आप 'PieFruit',' SaladFruit', 'WeaponFruit', आदि – dfeuer
जोड़ने के लिए यह देखते हुए कि आप इदरिस में हैं, तुम क्यों' WineStock' के लिए एक डेटाप्रकार परिभाषित कर रहे हैं चाहते हैं शुरू होता है ? तुम सिर्फ परिभाषित कर सकता हूँ नहीं 'isWineStock' एक मूल्य के स्तर समारोह के रूप में और सबूत में उपयोग जहां उपयुक्त हो? – sclv