द्वारा समूहित (ए, [बी]) की सूची में (ए, बी) कुंजी-मूल्य जोड़े (संभावित रूप से दोहराए गए कुंजियों के साथ) की सूची को परिवर्तित करना, मैं एक हास्केल शुरुआती हूं। मान लीजिए कि मैं एक फ़ंक्शन convertKVList
लिखना चाहता हूं जो कि कुंजी-मान जोड़े की एक विस्तृत सूची लेता है, जहां कुछ कुंजियों को दोहराया जा सकता है, और इसे कुंजी से सूचियों की सूची में मैपिंग में बदल देता है जहां सभी चाबियाँ अद्वितीय होती हैं। उदाहरण के लिए, Int
के जोड़ों की सूची पर, मैं इस व्यवहार को चाहते हैं:हास्केल: कुंजी
> convertKVList [(1, 2), (1, 4), (1, 3), (2, 3)]
[(1,[3,4,2]),(2,[3])]
यह एक आम पर्याप्त काम की तरह लगता है कि वहाँ एक पुस्तकालय है कि मैं क्या करना चाहते हैं के लिए उपलब्ध समारोह होना चाहिए, लेकिन मैं नहीं कर सके ' जब मैंने देखा तो कुछ भी नहीं मिला। अंत में, किसी ने सुझाव दिया कि मैं Map.fromListWith (++)
साथ Map.toList
रचना, और मैं इस के साथ समाप्त हो गया:
import Data.Map as Map (toList, fromListWith)
convertKVList :: (Ord a) => [(a, b)] -> [(a, [b])]
convertKVList ls =
(Map.toList . Map.fromListWith (++) . map (\(x,y) -> (x,[y]))) ls
मेरा प्रश्न अधिक अनुभवी Haskellers के लिए है और दो भागों में है: सबसे पहले, यह कैसे आप इसके बारे में जाना होगा, या क्या कोई "बेहतर" (पढ़ने में आसान, या अधिक कुशल, या दोनों) तरीका है?
दूसरा, मैं अपने साथ इस तरह कैसे आ सकता हूं? मुझे पता था कि मैं चाहता था कि यह प्रकार [(a, b)] -> [(a, [b])]
हो, लेकिन होउगल में डालने से कुछ भी उपयोगी नहीं हुआ। और मैंने Data.Map
दस्तावेज़ों को देखा था, लेकिन न तो fromListWith
और न ही toList
विशेष रूप से सहायक के रूप में बाहर निकल गया था। तो: आप इस समस्या के बारे में सोचने के बारे में कैसे जाएंगे? (मुझे एहसास है कि ये दोनों प्रश्न व्यक्तिपरक हैं, खासकर दूसरा।)
धन्यवाद!
धन्यवाद, यह सहायक है। यह आपके कदम (1) करने के लिए मेरे पास नहीं हुआ, और इसलिए जब मैंने दस्तावेज़ों में 'लिस्टविथ' से देखा, तो मैंने सोचा कि यह मेरी तरह की तरह दिखता है, लेकिन काफी नहीं, क्योंकि यह मुझे नहीं जाने देगा दूसरे घटक के प्रकार को 'बी' से' [बी] 'में बदलें। मुझे लगता है कि इसके बारे में सोचने का एक तरीका यह है कि चरण (1) वह है जो मैं करता हूं अगर चाबियाँ पहले से ही अनूठी थीं और _all_ मुझे करना था कि इस प्रकार मालिश को '(ए, [बी])' में मालिश करना था। तो अगर हम इसे 'सेलिस्टविथ' के साथ एक साथ रखते हैं, तो हम वहां से अधिकतर तरीके से हैं। –