2012-04-07 11 views
2

Ich habe eine Funktion (Häufigkeit), die zählt, wie oft jeder unterschiedliche Wert in einer Liste in dieser Liste auftritt. Zum BeispielSortieren einer Liste von Paaren mit Sortierung Haskell

frequency "ababca" 

zurückkehren sollen: durch das erste Element in der Liste der Liste

[(3, 'a'), (2, 'b'), (1, 'c')]. 

Dies funktioniert gut, aber jetzt brauche ich die Liste sortieren diese Funktion verwenden.

results :: [Party ] -> [(Int, Party)] 
results xs = ??? frequency (sort xs) ??? 

Beispiel gewünschte Ausgabe:

[(1, "Green"), (2, "Red"), (3, "Blue")] 

Die oben nicht funktioniert, habe ich keine Ahnung, was ich tun kann.

mit regulärer 'Art'

Danke im Voraus.

+1

Beachten Sie, dass Sie Semikola verwenden, in denen Haskell Kommas verwendet. – dave4420

Antwort

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

results xs = sortBy (compare `on` fst) (frequency xs) 

-- or, if you prefer 
results xs = sort (frequency xs) 

Links zur Dokumentation für on, sortBy, compare, fst.

Der Unterschied ist, dass sort in aufsteigender Reihenfolge des ersten Elements jedes Paares sortiert, brechen Tie-Breaks mit den zweiten Elementen der Paare, während sortBy (compare `on` fst) explizit nur das erste Element jedes Paares betrachtet.

+0

Wie kann ich reguläre "Sortierung" verwenden, um das Gleiche wie oben zu tun? – ErHunt

+1

@Badr Siehe meine Bearbeitung. – dave4420

+1

Sie können '' (vergleichen fst) 'anstelle von' (vergleichen \ 'on \ 'fst)'. – pat

2

Wenn Sie nur sort und nicht sortBy (aus irgendeinem Grund!) Verwenden können, dann müssen Sie sicherstellen, dass die Elemente eines Typs, die eine Instanz von Ord ist. Wie es passiert, haben alle Tupel (bis zur Größe 15) Ord Instanzen, vorausgesetzt, dass alle die Positionen im Tupel auch Ord Instanzen haben.

Das Beispiel, das Sie von (1, "Green"), (2, "Red"), (3, "Blue")] geben soll Art in Ordnung (wenn auch umgekehrt), da sowohl Int und StringOrd Instanzen haben.

In dem Code-Snippet erwähnen Sie jedoch auch einen Party-Typ, ohne zu sagen, was es ist. Wenn es nicht nur ein Alias ​​für etwas wie String ist, müssen Sie möglicherweise eine Ord-Instanz dafür definieren, um die eingebauten Ord-Instanzen für Tupel zu erfüllen.

können Sie haben Haskell Instanzen für Sie erstellen, mit deriving, wenn Sie den Typ

data Party = P1 | P2 | P3 | P4 -- e.g. 
    deriving (Eq,Ord) 

erklären oder erklären Sie es selbst:

instance Ord Party where 
    -- you don't care about the ordering of the party values 
    compare a b = EQ 

Aber, wie dave4420 sagt, es viel besser ist, nur zu benutze sortBy, also würde ich das tun, außer du hast einen bestimmten Grund nicht (dh es ist eine Klassenzuweisung mit Einschränkungen).

Verwandte Themen