Sorting a list of custom data types by certain attribute in Haskell -


मान लें कि हमारे पास कस्टम डेटा प्रकार है:

  डेटा व्यक्ति = व्यक्ति {first_name: : स्ट्रिंग, अंतिम_नाम :: स्ट्रिंग, उम्र :: इंट} deriving (ORD, EQ, Show)   

यह भी कहें कि मेरे पास इन व्यक्ति डेटा प्रकारों की सूची है I मैंने पहले से ही ऐसे फ़ंक्शन बना लिए हैं जो क्रम में इन लोगों को शामिल करता है, लेकिन यह प्रत्येक व्यक्ति के पहले मूल्य तक सीमित है, first_name मैं जो करने की कोशिश कर रहा हूं वह व्यक्ति डेटा प्रकार को संशोधित करता है ताकि इस प्रकार की फ़ंक्शन प्रथम_नाम के बजाय उम्र के अनुसार हो (केवल वरीयता को स्वैप करने के साथ ही उम्र पहले हो)। मुझे पता है मुझे ऑर्ड के लिए अपना खुद का तुलना फ़ंक्शन लिखने के लिए उदाहरण कीवर्ड का उपयोग करने की आवश्यकता है I यह वह जगह है जहाँ मैं फँस गया हूँ क्या कोई मेरी मदद कर सकता है?

संपादित करें: हां, यह है एचडब्ल्यू-- दुर्भाग्यवश इसे जिस तरह से मैं वर्णन कर रहा हूं उसे करने की आवश्यकता है।

उस समस्या से निपटने का सबसे आसान और सबसे लचीला तरीका है, यह देखते हुए कि व्यक्ति मानों को सॉर्ट करने के लिए कई वैध तरीके हैं, यह बदलकर नहीं है ORD उदाहरण, लेकिन एक कस्टम सॉर्टिंग फ़ंक्शन का उपयोग करके।

  आयात करें डेटा। सूची (सॉर्टब्य) आयात डेटा। ऑर्ड (तुलना) sortByAge :: [व्यक्ति] - & gt ; [व्यक्ति] sortByAge = sortBy (तुलना की उम्र)   

sortBy :: (a - & gt; एक - & gt; ऑर्डरिंग) - & gt; [ए] - & gt; [A] एक तुलना फ़ंक्शन से एक कस्टम सॉर्टिंग फंक्शन बनाता है, जबकि तुलना :: Ord a = & gt; (बी -> ए) - & gt; बी - & gt; बी - & gt; आदेश ऐसा एक तुलना फ़ंक्शन देता है, उदाहरण के लिए, फ़ील्ड एसेसर।

यदि आपको Ord उदाहरण को बदलने की आवश्यकता होती है, तो यह है कि यह कैसे होता है चले जाओ। वाक्यविन्यास निम्नानुसार है:

  उदाहरण के लिए जहां व्यक्ति की तुलना = अपरिभाषित - प्लेसहोल्डर   

हमें बताता है कि, सभी Ord < / कोड> विधियां, हमें बस को तुलना को लागू करने की आवश्यकता है। अब, हमें अपरिभाषित को किस प्रकार से बदलना चाहिए? हम तुलना को उम्र पर आधारित होना चाहते हैं, जो एक Int फ़ील्ड है। चूंकि int एक ओआरडी का एक उदाहरण है, जवाब तत्काल है:

  उदाहरण व्यक्ति जहां एक्सआई = तुलना (उम्र x) की तुलना करें ( उम्र y)   

संयोग से, यह है:

  तुलना :: (ऑर्ड ए) = & gt; (बी -> ए) - & gt; बी - & gt; बी - & gt; Pxy = तुलना (पीएक्स) की तुलना करना 

और इसलिए हम उस उदाहरण को लिख सकते हैं जो हमने पहले समाधान के लिए इस्तेमाल किया था:

  उदाहरण आयु व्यक्ति जहां तुलना = उम्र की तुलना    

Comments

Popular posts from this blog

Java - Error: no suitable method found for add(int, java.lang.String) -

c# - passing input text from view to contoller with FacebookContext using Facebook app -

Calling a C++ function from C# by passing a string with variable size to it -