2010-05-07 15 views
9

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

मुझे आश्चर्य है कि क्या एक ऐसा फ़ंक्शन लिखना संभव है जिसमें 3 तर्क भी शामिल हैं जो टुपल में दायर किए गए (या इंडेक्स) का नाम है, जिसके अनुसार सॉर्टिंग करना है।

इसे काफी सामान्य बनाने के लिए सबसे अच्छे समाधान क्या हैं?

+0

मुझे पता है कि आपका प्रश्न शायद आपकी जिज्ञासा के लिए अधिक है, लेकिन आप डेटा के साथ क्या कर रहे हैं? क्या एक क्रमबद्ध सूची वास्तव में आप समाप्त करना चाहते हैं? हम अब सी देश में निम्न-स्तरीय सरणी में तत्वों के चारों ओर घूम रहे नहीं हैं और हैकेल आपको रोचक डेटा प्रकारों के पूरे चिड़ियाघर तक आसानी से पहुंच प्रदान करता है जो शायद "सॉर्ट" के साथ करने के लिए आप जो भी कर रहे हैं, डेटा। – jberryman

+0

कारण यह है कि मैं सीख रहा हूं और जानना चाहता हूं कि संभावनाएं क्या हैं, और सॉर्ट फ़ंक्शन वह है जिसे हर कोई समझता है ताकि स्पष्टीकरण आसान हो। मुझे पता है कि एम्बेडेड प्रकारों के बारे में पता है, अभी भी सीखना, धन्यवाद – gruber

उत्तर

22
take x $ sortBy (compare `on` fst) [("asd", 1), ...] 

take x क्रमबद्ध सूची से पहले एक्स आइटम लेता है। sortBy पहली तर्क के रूप में दिए गए सॉर्टिंग फ़ंक्शन का उपयोग करके दूसरे तर्क के रूप में दी गई सूची को टाइप करता है। (compare `on` fst) प्रत्येक ट्यूपल के पहले मानों की तुलना करता है। ध्यान दें कि यह उदाहरण सॉर्टिंग के लिए प्रत्येक टुपल के पहले मान की तुलना करता है। दूसरे मान से सॉर्ट करने के लिए, fst को snd से बदलें।

आप देखते हैं कि sortBy फ़ंक्शन बहुत सामान्य है, क्योंकि यह आपको मानों की तुलना करने के लिए उपयोग किए गए फ़ंक्शन को परिभाषित करने देता है। समारोह में दो तर्क होते हैं और उन्हें एलटी, ईक्यू या जीटी में से एक लौटा देना चाहिए। ध्यान दें कि फ़ंक्शन compare दोनों तर्कों को Ord से प्राप्त करने की आवश्यकता है। सहायक on मॉड्यूल Data.Function में पाया जा सकता है। फ़ंक्शन sortBy मॉड्यूल Data.List में है।

संपादित करें: यहां एक पूर्ण कार्य उदाहरण है जो उनके पहले मूल्यों की तुलना करके टुपल्स की एक सूची टाइप करता है और परिणामी सूची के पहले 2 tuples प्रिंट करता है। ध्यान दें कि मैंने ऊपर दिए गए उदाहरण से on को समकक्ष फ़ंक्शन के साथ प्रतिस्थापित किया है जो दर्शाता है कि on आंतरिक रूप से क्या करता है।

import Data.Function 
import Data.List 

main = print $ mySort [("foo", 1), ("bar", 2), ("baz", 3), ("quux", 4)] 2 

mySort list x = take x $ sortBy (\ x y -> compare (fst x) (fst y)) list 

संपादित करें: टॉम Lokhorst के रूप में उसकी टिप्पणी में बताया, मॉड्यूल Data.Ord से समारोह comparing अधिक पठनीय प्रतिस्थापन/on compare के लिए शॉर्टकट है, इसलिए ऊपर भी sortBy (comparing fst) रूप में लिखा जा सकता है।

+8

ध्यान दें कि 'Data.Ord' से 'तुलना' फ़ंक्शन तुलनात्मक रूप से 'जैसा है' जैसा ही है। तो आप 'sortby (fst की तुलना) सूची' भी लिख सकते हैं। –

+0

अच्छा, मुझे वह नहीं पता था। – jkramer

+0

क्या आपको 'sort'' से पहले' लेना 'नहीं चाहिए? MySort संभावित रूप से एक अनंत सूची ले सकता है। –

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