2011-09-19 18 views
5

Quiero usar Data.List.groupBy para agrupar una lista de tuplas según la igualdad del elemento snd.
que podía hacer esto:¿Existe una solución de biblioteca estándar para este problema de Haskell?

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

Pero me parece demasiado repetitivo en la función de comparación - en especial, ya que podría conseguir mucho más complicado si estuviera haciendo una comparación más complicada. Me gustaría hacer algo como:

groupBy (comparing snd) listOfTuples 

pero el tipo de firma de la comparación es comparing :: (Ord a) => (b -> a) -> b -> b -> Ordering, por lo que no se compila en este ejemplo.
también podía hacer:

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

Pero esto no es mejor que la primera. ¿Existe una solución de biblioteca estándar para este problema, antes de lanzar mi propia cuenta?

Respuesta

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

creo que solía haber equating = on (==) en las bibliotecas estándar, aunque me parece que no puede encontrar ahora.

+0

¿De qué paquete viene 'on'? –

+3

@Matt: Data.Function (http://hackage.haskell.org/packages/archive/base/latest/doc/html/Data-Function.html#v:on) en general, puede buscar funciones en hoogle: http://www.haskell.org/hoogle/?hoogle=on – porges

+0

@Porges: ¡gracias! –

-1

¿Esto es lo que quieres?

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

esto no compila –

+0

Hmm, yo siempre pienso. es mágico Pero, por desgracia, no lo es. Creo que hay una función de elevación que quizás hace algo similar. 'lift :: (a-> b) -> (c-> d-> b) -> c -> d'. Hoogle me da 'sobre 'como sugirió @ Daniel Wagner. – nulvinge

+2

Puede escribirlo como 'groupBy (((== EQ).) Comparando snd) listOfTuples'. Tenga en cuenta la composición de función parcialmente aplicada. – hammar

Cuestiones relacionadas