2010-06-17 29 views
17

के लिए अपने स्वयं के ऑर्ड को परिभाषित करना मैं ग्राफ पहेली को हल करने के लिए कुछ डेटा संरचनाएं करने का प्रयास कर रहा हूं। मैं किनारे के तुलना मानदंड को परिभाषित करने की कोशिश कर रहा हूं, लेकिन मुझे यकीन नहीं है कि कैसे। अब तक:डेटा प्रकार (हास्केल)

data Edge = Edge (Set String) Bool 

मैं संकलक जाने कैसे बताऊँ पता है कि मैं किनारों बराबर घोषित किया है अगर वे तार के समान सेट है, और समानता नहीं चाहते बूलियन मान से कोई लेना देना है?

+0

'व्युत्पन्न' कीवर्ड के बारे में न भूलें! –

उत्तर

34

हालांकि मुझे यकीन है कि तुम क्यों बूलियन मान (मैं उत्सुक हूँ) की अनदेखी करने, आप अपने खुद Eq उदाहरण परिभाषित करना होगा ऐसा करना चाहते हैं नहीं कर रहा हूँ; डिफ़ॉल्ट एक काम नहीं करेगा, क्योंकि यह हर क्षेत्र की तुलना करता है। सौभाग्य से, यह आसान है:

instance Eq Edge where 
    (Edge s1 _) == (Edge s2 _) = s1 == s2 

आप किनारों ऑर्डर करने के लिए सक्षम होना चाहते हैं, और आप आदेश भी सिर्फ सेट की तुलना करना चाहते तो अपने क्रियान्वयन बहुत समान है:

instance Ord Edge where 
    (Edge s1 _) `compare` (Edge s2 _) = s1 `compare` s2 

प्रत्येक प्रकार वर्ग विधियों के एक निश्चित सेट को परिभाषित करता है जिसे लागू करने की आवश्यकता है; Eq== या /= की आवश्यकता है, और Ord को <= या compare की आवश्यकता है। (यह जानने के लिए कि कौन से फ़ंक्शंस आवश्यक हैं और जो वैकल्पिक हैं, आप दस्तावेज़ों को देख सकते हैं।)

+3

मैं बूलियन को अनदेखा कर रहा हूं क्योंकि मैं एक निर्देशित ग्राफ के साथ काम कर रहा हूं। हालांकि, क्योंकि केवल मेरे लिए महत्वपूर्ण किनारों वे हैं जो दोनों नोड्स के बीच द्विपक्षीय हैं। मैं बूलियन को "पारस्परिक" फ़ील्ड के रूप में उपयोग कर रहा हूं, इसलिए मैं किसी भी निर्देशित किनारों से छुटकारा पा सकता हूं जिनके बराबर रिटर्निंग एज नहीं है। मैं फिर एक अप्रत्यक्ष ग्राफ बनाने के लिए उस बुलियन पर फ़िल्टर कर सकता हूं। यह बदसूरत है लेकिन मैं छोटी सूचना पर कुछ और नहीं सोच सकता। –

9
import Data.Set 

data Edge = Edge (Set String) Bool deriving Show 

instance Eq Edge where 
    (Edge a _) == (Edge b _) = a == b 

instance Ord Edge where 
    compare (Edge a _) (Edge b _) = compare a b 
संबंधित मुद्दे