यह एक प्रोग्रामिंग शैली और सामान्य प्रथाओं के बारे में एक सवाल है। लेकिन मुझे लगता है कि यह कोड समीक्षा मंच में फिट नहीं है ...किसी डेटा प्रकार को अधिभारित करने या समान उपयोग करने के लिए?
मेरा प्रोग्राम नियमित अभिव्यक्तियों को पार करता है और उन्हें संसाधित करता है। रेगुलर एक्सप्रेशन सामान्य तत्वों (क्लीन बंद, संयोजन, आदि) हो सकता है और यह भी, उनके नाम से अन्य नियमित अभिव्यक्ति के लिए संदर्भ हो सकता है मैक्रो की तरह:
data Regex a = Epsilon
| Literal a
| Ranges [(a, a)]
| Ref String
| Then (Regex a) (Regex a)
| Or (Regex a) (Regex a)
| Star (Regex a)
मैं रेगुलर एक्सप्रेशन संसाधित होने के बाद और सभी मैक्रो को हल
: संदर्भ, औरRange
तत्वों को
Literal
तत्वों परिवर्तित (यह मेरी प्रयोजनों के लिए की जरूरत है), मैं एक प्रकार है कि नहीं और
Ref
और
Literal
नहीं होना चाहिए कर सकते हैं के साथ खत्म हो, मेरे कार्यों कि इसके साथ काम में तो मैं कुछ पसंद है
foo (Literal _) = error "unexpected literal"
foo (Ref _) = error "unexpected reference"
foo (Epsilon) = ...
foo (Star x) = ...
...
यह बदसूरत दिखता है मुझे क्योंकि यह संकलन के दौरान चेक के बजाय रनटाइम चेक करता है। एक बहुत ही तरह की दृष्टिकोण नहीं है।
तो शायद मैं एक और डेटा प्रकार पेश कर सकता हूं जो मूल के समान है और इसका उपयोग करता है?
data RegexSimple a = Epsilon2
| Ranges2 [(a, a)]
| Then2 (Regex a) (Regex a)
| Or2 (Regex a) (Regex a)
| Star2 (Regex a)
काम यही है, लेकिन यहाँ मैं दोहराव के लिए बहुत कुछ है और यह भी निर्माताओं की अच्छी और वर्णनात्मक नाम अब लिया जाता है और मैं नए आविष्कार करने की जरूरत है ...
विशेषज्ञों क्या करना होगा यहाँ? मैं सीखना चाहता हूं:)
क्या आपने [GADTs] को देखा है (https: // en।wikibooks.org/wiki/Haskell/GADT)? – Kwarrtz
बस यह इंगित करना चाहते हैं कि आप "समान" कन्स्ट्रक्टर नामों के साथ दूसरे डेटा प्रकार का उपयोग कर सकते हैं यदि आप इसे किसी भिन्न मॉड्यूल में परिभाषित करते हैं। फिर आप 'आयात योग्य ... जैसे ...' का उपयोग कर सकते हैं यदि कुछ कोड दोनों प्रकारों से निपटने की ज़रूरत है। – ErikR
'डेटा प्रकार ए ला कार्टे' http://www.cs.ru.nl/~W.Swierstra/Publications/DataTypesALaCarte.pdf –