2012-02-16 10 views

Respuesta

13

Puede utilizar sortBy y comparing:

sortBy :: (a -> a -> Ordering) -> [a] -> [a] 
comparing :: (Ord b) => (a -> b) -> a -> a -> Ordering 

En este caso, queremos comparar por el segundo elemento . Puede usar comparing snd para obtener una función que pueda comparar dos tuplas por su segundo elemento.

+0

Si quisiera definir mi propia función de clasificación para llamar desde cualquier lugar, ¿cómo puedo hacer esto exactamente? Puede que necesite usar esto más de una vez – user1214840

+0

En otras palabras, quería definir mi propia función de clasificación que toma un lits de tuplas, la ordena en función de su segundo elemento y luego devuelve la misma lista ordenada de tuplas. – user1214840

+2

@ user1214840 Igual que cualquier otra definición: 'myFancySort = {- implementación usando las sugerencias de ehird aquí -}' –

15

Otro buen truco es utilizar on de Data.Function:

import Data.Function (on) 
import Data.List (sortBy) 

sortBy (compare `on` snd) [...] 
No

muy diferente de comparing pero un buen truco de vez en cuando.

+4

'on' tiene algunos trucos agradables. De vez en cuando encuentro 'equating = on (==)' para ser útil. ('comparando = en comparación') –

2

Considérese un "regular" ordenar

sort xs = ... a < b ... 

Estas clases deben hacer uso de compare, o sus amigos como <. Entonces, si ya ha implementado algo así, en lugar de simplemente compare a b o a < b, puede hacer compare (snd a) (snd b) o snd a < snd b.

sort xs = ... snd a < snd b ... 

Por supuesto, si usted consigue inteligente, podrás abstracta a cabo el "descriptor de acceso", y que sea una entrada adicional a la función de clasificación:

sortComparingOn f xs = ... f a < f b ... 

incluso se podría abstraer comparador conjunto :

sortBy cmp xs = ... a `cmp` b ... 

sortBy se proporciona en Data.List, como ehird mencionado.