2010-07-25 16 views
16

पर हास्केल पैटर्न मिलान मैं सूचियों को सेट करने के लिए कुछ हास्केल कोड बदल रहा हूं। मुझे लगता है कि सब कुछ आवश्यक है, मुझे लगता है, लेकिन मुझे यकीन नहीं है कि सेट पर पैटर्न मिलान कैसे करें। सूची में यह अच्छा शाब्दिक वाक्यविन्यास है जो सेट कन्स्ट्रक्टर के साथ अनुकरण करना मुश्किल लगता है। उदाहरण के लिए, मैं इस तरह कुछ कोड हो सकता है:खाली सेट

foo [] = [] 
foo x = other_thing 

कैसे इसलिए सूचियों के बजाय सेट का उपयोग करता है मैं इस कोड लिख सकते हैं?

उत्तर

30

ठीक है, आप नहीं कर सकते।

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, और foldData.Set में फ़ंक्शंस।

[0]: इस शब्द की परिभाषा के लिए this paper (चेतावनी: पीडीएफ) देखें, जैसा कि मैं इसका उपयोग कर रहा हूं।

+0

+1! – ShiDoiSi

29
import qualified Data.Set as Set 

foo set 
    | Set.null set = bar 
    | otherwise = baz 
+1

+1 सरल उत्तर –

+7

@simonjpascoe: प्रतीक्षा करें, हम * सरल * उत्तर दे सकते हैं? और यहां इस बार मैंने सोचा था कि तीन पैराग्राफ न्यूनतम था ... ViewPatterns संदर्भ के लिए –

संबंधित मुद्दे