www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

Daten merken
Auto-Login
Registrieren
 
Online
niemand
 
Forumsuche
Suche nach:

Logo - DracheHaskell-Forum

Luks

Gepostet:
09.12.2009 14:02

sortBy /compPair  
sorry, hatte die überschrift vergessen:

hey,kann mir jemand erklrren, wie sortBy funktioniert?

hintergrund is, dass ich folgende aufgabe habe:
ich soll eine list sortieren deren elemente vom typ student sind
student = (Name,Vorname),(Klausur,Note)
type Name = String
type Vorname = String
type Klausur = String
type Note = Double

die funktion soll folgende struktur haben und mit sortBy arbeiten:
compPair :: ((Name,Vorname),(Klausur,Note)) -> ((Name,Vorname),(Klausur,Note)) -> Ordering

sortiert werden soll nach namen (und ggf. vornamen) alphabetisch und nach prüfungsnoten aufsteigend

gegeben ist:
sortBy :: (a -> a -> Ordering) -> [a] -> [a]
sortBy cmp = foldr (insertBy cmp) []

insertBy :: (a -> a -> Ordering) -> a -> [a] -> [a]
insertBy cmp x [] = [x]
insertBy cmp x ys@(y:ys') = if cmp x y == GT
then y : insertBy cmp x ys'
else x : ys


mein ansatz:

type Name = String
type Vorname = String
type Klausur = String
type Note = Double

compPair :: ((Name,Vorname),(Klausur,Note)) -> ((Name,Vorname),(Klausur,Note)) -> Ordering
compPair xs = sortBy Name xs

sortBy :: (a -> a -> Ordering) -> [a] -> [a]
sortBy cmp = foldr (insertBy cmp) []

insertBy :: (a -> a -> Ordering) -> a -> [a] -> [a]
insertBy cmp x [] = [x]
insertBy cmp x ys@(y:ys') = if cmp x y == GT
then y : insertBy cmp x ys'
else x : ys
Zum Seitenanfang    
 
Siracusa

Gepostet:
10.12.2009 00:41

   
Hallo,

sortBy sortiert eine Liste mit Hilfe der übergebenen Funktion. Das heißt die Funktion bestimmt wie ein Vergleich zwischen zwei Elementen des gleichen Typs aussieht. Ein einfaches Beispiel:
vergleiche :: Int -> Int -> Ordering
vergleiche x y
| x < y = LT -- x kommt vor y
| x == y = EQ -- x und y sind gleich
| x > y = GT -- x kommt nach y

sortBy wird nun mit vergleiche und einer Liste von Zahlen aufgerufen und sortiert die Liste entsprechend.

Was du nun machst, ist eine Funktion wie vergleiche zu implementieren (nämlich compPair), die zwei Studenten bekommt und für die beiden entscheidet, welcher von beiden "kleiner" als der andere ist, d.h. nach Namen, bei Namengleichheit nach Vornamen usw. sortBy wird dann mit compPair aufgerufen (nicht andersrum!) und sortiert eine Liste von Studenten.

sortBy Name geht nicht (wäre auch zu einfach ;-) ), denn Name ist ein Typ und Typen können keine Parameter von Funktionen sein.


Viele Grüße,

Siracusa
Zum Seitenanfang