2012-04-11 11 views
6

में कस्टम डेटा प्रकारों के बारे में उलझन में कार्य: मैं कस्टम डेटा प्रकार बनाने की कोशिश कर रहा हूं और इसे कंसोल पर प्रिंट करने में सक्षम हूं। मैं भी हास्केल के प्राकृतिक क्रम का उपयोग करके इसे सॉर्ट करने में सक्षम होना चाहता हूं।हास्केल

समस्या: अब लिखें, मुझे यह कोड संकलित करने के लिए नहीं मिल सकता है। यह निम्न त्रुटि फेंकता है: No instance for (Show Person) arising from a use of 'print'

क्या मैं अब तक है:

-- Omitted working selection-sort function 

selection_sort_ord :: (Ord a) => [a] -> [a] 
selection_sort_ord xs = selection_sort (<) xs 

data Person = Person { 
    first_name :: String, 
    last_name :: String, 
    age :: Int }    

main :: IO() 
main = print $ print_person (Person "Paul" "Bouchon" 21) 

उत्तर

8

आप एक मुद्रण योग्य प्रतिनिधित्व (एक String) करने के लिए प्रकार परिवर्तित करने के लिए एक Show उदाहरण की जरूरत है। एक प्राप्त करने का सबसे आसान तरीका

deriving Show 

टाइप परिभाषा में जोड़ना है।

data Person = Person { 
    first_name :: String, 
    last_name :: String, 
    age :: Int } 
     deriving (Eq, Ord, Show) 

सबसे अधिक आवश्यक उदाहरण प्राप्त करने के लिए।

आप एक अलग Ord उदाहरण, के रूप में के बजाय कि पाने की, टिप्पणी में सुझाव दिया (जब तक आप उन लोगों के लिए अलग व्यवहार चाहते Eq और Show पाने रखने के लिए), की तरह

instance Ord Person where 
    compare p1 p2 = case compare (age p1) (age p2) of 
         EQ -> case compare (last_name p1) (last_name p2) of 
           EQ -> compare (first_name p1) (first_name p2) 
           other -> other 
         unequal -> unequal 

या उपयोग एक उदाहरण प्रदान करते हैं चाहते हैं compare यदि आप पसंद की परिभाषा में पैटर्न मिलान,

compare (Person first1 last1 age1) (Person first2 last2 age2) = 
     case compare age1 age2 of 
      EQ -> case compare last1 last2 of 
        EQ -> compare first1 first2 
        other -> other 
      unequal -> unequal 

उम्र पहले, तो अंतिम नाम, और अंत में, यदि आवश्यक हो तो, प्रथम नाम के अनुसार तुलना है।

+0

कूल, धन्यवाद। तो ईक और ऑर्ड व्यक्ति को स्वाभाविक रूप से हल करने की अनुमति देगा? –

+1

यूप, 'ऑर्ड' इंस्टेंस (जिसके लिए 'ईक' की आवश्यकता है) के साथ,' डेटा.लिस्ट 'से मानक' सॉर्ट' सॉर्टिंग के लिए उपलब्ध है। –

+0

और यदि मैं उम्र बढ़ने के क्रम में व्यक्ति की वस्तुओं की सूची को क्रमबद्ध करने के लिए 'select_sort_ord' (ऊपर) का उपयोग करना चाहता था, तो' उदाहरण 'कीवर्ड का उपयोग करके अपना' तुलना' फ़ंक्शन लिखने के लिए, मैं कैसे करूं इस? –