2010-07-05 6 views
8

Supposons que j'ai x :: [(n, a)] où n est un nombre et a est un élément non ordonniable (n'est pas de classe Ord).Haskell trier une liste non ordonniable en utilisant un ordre proxy

Je veux trier cette liste par n. Je ne peux pas faire sort x parce que a ne peut pas être commandé. Je peux remplacer a par des indices, puis assembler la nouvelle liste en utilisant !! mais cela semble être une mauvaise solution.

Alternatives?

Répondre

12

Ugh. Ça ne fait rien. sortBy.

+10

pas seulement 'sortBy' mais' sortBy (comparaison de fst) '(au cas où vous n'auriez jamais entendu parler de la fonction' comparison'). –

+0

'comparaison 'est dans' Data.Ord'. (Mais vous le saviez, parce que vous avez utilisé hoogle.) – Yitz

+3

[Hoogle] (http://haskell.org/hoogle)? Cool, je demandais toujours à Neil Mitchell chaque fois que je devais savoir où était une fonction ... –

5

Vous voulez

sortBy (compare `on` fst) 

ou quelque chose de similaire. Vous trouverez on défini dans le module Data.Function et sortBy dans Data.List, que vous devrez importer.

+0

Juste comme un suivi, l'utilisation plus classique est de profiter de la définition: comparaison = sur la comparaison contredire le Dr Ramsey beaucoup mieux qualifié, juste en soulignant un style plus habituel. – BMeph

+0

@BMpeh ne me donne pas plus de crédit que je vaux. J'ai appris «sur la comparaison» de quelqu'un d'autre et je suis heureux d'apprendre à «comparer» de vous. (Laissant la réponse inchangée de peur que les lecteurs deviennent désespérément confus.) –

2

En outre, si vous avez une fonction alternative (par exemple, appeler f) à partir de laquelle pour former une commande, vous pouvez utiliser les propriétés Data.Monoid de commande:

sortBy (comparing fst `mappend` comparing (f . snd)) 

qui utilisera votre fonction sur le deuxième composant de la paire. Si vous n'avez pas besoin ou n'avez pas un deuxième critère pour trier vos paires, alors le sortBy (comparing fst) sera très bien (la liste résultante aura juste des paires avec le même premier composant dans l'ordre de la liste).

Questions connexes