2011-09-19 8 views
5

Chcę użyć Data.List.groupBy do zgrupowania listy krotek na podstawie równości elementu snd.
mogę to zrobić:Czy istnieje standardowe rozwiązanie biblioteki do tego problemu Haskell?

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

Ale wydaje mi się zbyt dużo boilerplate w funkcji porównania - szczególnie, ponieważ może dostać dużo bardziej niechlujny jakbym robi bardziej skomplikowane porównania. Chciałbym zrobić coś takiego:

groupBy (comparing snd) listOfTuples 

ale podpis typu porównanie jest comparing :: (Ord a) => (b -> a) -> b -> b -> Ordering, więc nie skompilować w tym przykładzie.
mogłem również zrobić:

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

Ale to nie jest lepiej niż za pierwszym razem. Czy istnieje rozwiązanie oparte na standardowej bibliotece tego problemu, zanim uruchomię swoje własne?

Odpowiedz

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

myślę, że kiedyś equating = on (==) w standardowych bibliotekach, choć nie wydaje się go znaleźć teraz.

+0

Z jakiego pakietu pochodzi 'na'? –

+3

@Matt: Data.Function (http://hackage.haskell.org/packages/archive/base/latest/doc/html/Data-Function.html#v:on) ogólnie możesz szukać funkcji w hoogle: http://www.haskell.org/hoogle/?hoogle=on – porges

+0

@Porges: thanks! –

-1

Czy tego chcesz?

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

to nie kompiluje –

+0

Hmm, zawsze myślę. jest magiczne. Ale niestety tak nie jest. Myślę, że jest funkcja windy, która może robi coś podobnego. 'lift :: (a-> b) -> (c-> d-> b) -> c -> d'. Hoogle daje mi "na", jak sugerował @Daniel Wagner. – nulvinge

+2

Możesz napisać to jako 'groupBy (((== EQ).) Porównywanie snd) listOfTuples'. Zwróć uwagę na częściowo zastosowany skład funkcji. – hammar

Powiązane problemy