ठीक है, आप नहीं कर सकते।
Set
है एक सार डेटा प्रकार[0] कि जान-बूझकर अपने आंतरिक प्रतिनिधित्व छुपाता है, मुख्य रूप से डेटा संरचना प्रकार प्रणाली (विशेष रूप से, मानक पुस्तकालय द्वारा कि नहीं स्थिर-लागू किया जा सकता की अपरिवर्तनशीलताओं बनाए रखने के लिए Data.Set.Set
एक बाइनरी खोज पेड़ है)।
एक सार डेटा प्रकार पर पैटर्न मिलान की क्षमता खोना संपार्श्विक क्षति का एक अप्रिय बिट है, लेकिन ओह ठीक है। आपके विकल्प मोटे तौर पर हैं:
- बूलियन भविष्यवाणियों और गार्ड का प्रयोग करें, उदा।
null
, जैसा कि त्रिनिथिस के उत्तर में है।
Set
को एक सूची में कनवर्ट करें। अधिकांश समय यह मूर्खतापूर्ण है लेकिन यदि आप सेट के माध्यम से फिर से शुरू करना चाहते हैं, तो यह काफी अच्छी तरह से काम करता है।
- GHC's
ViewPatterns
extension सक्षम करें, जो एक्सेसर फ़ंक्शंस का उपयोग करने के लिए सिंटैक्टिक चीनी प्रदान करता है जहां एक पैटर्न मिलान सामान्य रूप से जाता है।
- इस तरह के चेक को पहले स्थान पर बनाने से बचें - यदि आपके पास
Set
है, तो इसे पर सेट करें, और मैपिंग, फ़िल्टरिंग इत्यादि के लिए पूरी तरह से इसके साथ काम करें। हमेशा संभव नहीं है, लेकिन नेतृत्व कर सकता है कम स्पष्ट सशर्त/पुनरावृत्तियों के साथ क्लीनर कोड के लिए।
देखें पैटर्न आप कुछ है कि इस तरह दिखता है लिखना दिया जाएगा:
foo (setView -> EmptySet) = []
foo (setView -> NonEmpty set) = other_thing
... जहां setView
एक समारोह आप लिखते है। बढ़त के यहाँ की वास्तव में बहुत ज्यादा नहीं है, लेकिन और अधिक जटिल छद्म पैटर्न
स्पष्ट चेकों से बचने के लिए, के अलावा जाने-माने सेट संचालन इस तरह के union
और intersection
के रूप में, का इस्तेमाल कर रही पर विचार के लिए अच्छा हो सकता है filter
, partition
, map
, और fold
Data.Set
में फ़ंक्शंस।
[0]: इस शब्द की परिभाषा के लिए this paper (चेतावनी: पीडीएफ) देखें, जैसा कि मैं इसका उपयोग कर रहा हूं।
स्रोत
2010-07-25 01:06:28
+1! – ShiDoiSi