2011-09-19 19 views
5

snd öğesinin eşitliğine bağlı olarak bir grup tuples grubunu gruplamak için Data.List.groupBy'yi kullanmak istiyorum.Bu Haskell sorununa standart bir kütüphane çözümü var mı?

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

Ama bu bana karşılaştırma fonksiyonu olarak çok fazla klişe çarpar - Bir daha karmaşık bir karşılaştırma yaptıklarını takdirde bunun çok daha dağınık alabilir özellikle çünkü:
ben bunu. Ben böyle bir şey yapmak istiyorum:

groupBy (comparing snd) listOfTuples 

ama bu örnekte derleme değil bu yüzden karşılaştırarak türü imza comparing :: (Ord a) => (b -> a) -> b -> b -> Ordering olduğunu.
Ben de olabilir yapın:

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

Ama bu ilk denemede daha iyidir. Bu soruna, kendi hesabımı kullanmadan önce standart kütüphane çözümü var mı?

cevap

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

sanırım şimdi bulmak için görünmüyor olabilir ama orada, standart kütüphanelerde equating = on (==) olarak kullanılan düşünüyorum.

+0

Hangi pakette '' 'geliyor? –

+3

@Matt: Data.Function (http://hackage.haskell.org/packages/archive/base/latest/doc/html/Data-Function.html#v:on) genel olarak hoogle'daki işlevleri arayabilirsiniz: http://www.haskell.org/hoogle/?hoogle=on – porges

+0

@Porges: teşekkürler! –

-1

İstediğiniz bu mu?

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

bu derleme –

+0

Hmm, her zaman düşünüyorum. büyülü. Ama ne yazık ki değil. Sanırım benzer bir şey yapan bir kaldırma fonksiyonu var. lift :: (a-> b) -> (c-> d-> b) -> c -> d '. Hoogle, @Daniel Wagner'in önerdiği gibi "beni" verdi. – nulvinge

+2

Bunu “groupBy (((== EQ)... Snd) listOfTuples' ile karşılaştırarak yazabilirsiniz. Kısmen uygulanan fonksiyon bileşimine dikkat edin. – hammar

İlgili konular