2010-07-05 1 views
8

Supponiamo di avere x :: [(n, a)] dove n è un numero e a è un articolo non ordinabile (non è di classe Ord).Ordinamento Haskell di un elenco non ordinabile utilizzando un ordine proxy

Voglio ordinare questa lista di n.

Non riesco a fare sort x perché a non è ordinabile. Posso sostituire a per indici e quindi assemblare il nuovo elenco utilizzando !! ma questa sembra una soluzione scadente.

Alternative?

risposta

12

Ugh. Non importa. sortBy.

+10

non solo 'sortBy' ma' sortBy (confronto fst) '(nel caso non si sia mai sentito parlare della funzione' comparing'). –

+0

'confronto 'è in' Data.Ord'. (Ma lo sapevi, perché hai usato hoogle.) – Yitz

+3

[Hoogle] (http://haskell.org/hoogle)? Cool, ho sempre chiesto a Neil Mitchell ogni volta che avevo bisogno di sapere dove fosse una funzione ... –

5

Volete

sortBy (compare `on` fst) 

o qualcosa di simile. Troverai on definito nel modulo Data.Function e sortBy in Data.List, che dovrai importare.

+0

Come seguito, l'uso più convenzionale è quello di sfruttare la definizione: comparativo = su confronta contraddicono la dottoressa Ramsey, molto più abile, sottolineando uno stile più usuale. – BMeph

+0

@BMpeh non mi danno più credito di quanto valga. Ho imparato "a confronto" da qualcun altro e sono felice di imparare il "confronto" da te. (Lasciando la risposta invariata affinchè i lettori diventino irrimediabilmente confusi). –

2

Inoltre, se si dispone di una funzione alternativa (ad esempio, chiamare f) da cui per formare un ordine, è possibile utilizzare le proprietà Data.Monoid di Ordinazione:

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

che utilizzerà la funzione su il secondo componente della coppia. Se non hai bisogno o hai un secondo criterio su cui ordinare le tue coppie, allora lo sortBy (comparing fst) andrà bene (l'elenco risultante avrà solo coppie con lo stesso primo componente in ordine di lista).