2011-09-19 12 views
5

मैं snd तत्व की समानता के आधार पर tuples की एक सूची को समूहित करने के लिए Data.List.groupBy का उपयोग करना चाहता हूं।
मैं ऐसा कर सकता है:क्या इस हास्केल समस्या के लिए मानक पुस्तकालय समाधान है?

groupBy (\l r -> snd l == snd r) listOfTuples 

लेकिन यह मुझे तुलना समारोह में के रूप में बहुत ज्यादा बॉयलरप्लेट हमलों - विशेष रूप से, क्योंकि यह एक बहुत अधिक गन्दा मिल सकता है अगर मैं एक और अधिक जटिल तुलना कर रहे थे। मैं कुछ ऐसा करना चाहते हैं:

groupBy (comparing snd) listOfTuples 

लेकिन की तुलना के प्रकार के हस्ताक्षर, comparing :: (Ord a) => (b -> a) -> b -> b -> Ordering है तो यह इस उदाहरण में संकलित नहीं है।
मैं भी कर सकता है:

groupBy (\l r -> (comparing snd l r) == EQ) listOfTuples 

लेकिन यह कोई पहली कोशिश से बेहतर है। क्या इससे पहले कि मैं खुद को रोल करता हूं, इस समस्या के लिए मानक-लाइब्रेरी समाधान है?

उत्तर

15
groupBy ((==) `on` snd) listOfTuples 

मैं हालांकि मैं अब यह पता लगाने के लिए नहीं कर पा रहे वहाँ, मानक पुस्तकालयों में equating = on (==) हुआ करता था लगता है।

+0

'कौन से पैकेज' से आया है? –

+3

@ मैट: डेटा। फ़ंक्शन (http://hackage.haskell.org/packages/archive/base/latest/doc/html/Data-Function.html#v:on) सामान्य रूप से आप hoogle पर फ़ंक्शंस की खोज कर सकते हैं: http://www.haskell.org/hoogle/?hoogle=on – porges

+0

@ पोर्गेस: धन्यवाद! –

-1

क्या आप यह चाहते हैं?

groupBy ((==EQ) . comparing snd) listOfTuples 
+0

यह –

+0

हम्म संकलित नहीं करता है, मैं हमेशा सोचता हूं। जादुई है लेकिन हां यह नहीं है। मुझे लगता है कि एक लिफ्ट फ़ंक्शन है जो शायद कुछ ऐसा ही करता है। 'लिफ्ट :: (ए-> बी) -> (सी-> डी-> बी) -> सी -> डी'। होगल मुझे 'ऑन' देता है क्योंकि @ डैनियल वाग्नेर ने सुझाव दिया था। – nulvinge

+2

आप इसे 'groupBy (((== ईक्यू) के रूप में लिख सकते हैं।) एसएनडी की तुलना) listOfTuples'। आंशिक रूप से लागू फ़ंक्शन संरचना पर ध्यान दें। – hammar

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