2016-05-17 18 views
1

Ich versuche Insertion Sortierung in Haskell für meine wöchentliche Universität Aufgabe zu implementieren. Das ist mein Einsatz und Sortierfunktion:Insertionsort in Haskell mit der angegebenen Reihenfolge

insert :: (Ord a) => a -> [a] -> [a] 
    insert a [] = [a] 
    insert a (a':as) 
     | a <= a' = a:a':as 
     | otherwise = a':insert a as 


    insertionSort :: (Ord a) => [a] -> [a] 
    insertionSort []  = [] 
    insertionSort (a:as) = insert a (insertionSort as) 

Das funktioniert aber mein Lehrer angegeben die Signatur wie folgt:

insert :: (a -> a -> Bool) -> a -> [a] -> [a] 
insertionSort :: (a -> a -> Bool) -> [a] -> [a] 

Alles, was ich versucht inzwischen gescheitert und die Compiler-Fehler sind auch nicht wirklich hilfreich. Hoffe ihr könnt mir dabei helfen!

Edit:

Das gegebene Beispiel von meinem Tutor sieht so aus:

Main> insert (<) 3 [1,2,5,7,9] 
[1,2,3,5,7,9] 
Main> insSort (>) [7,9,1,2,5] 
[9,7,5,2,1] 

Antwort

2

Alles, was Sie tun müssen, ist anstelle eines festen Vergleich das Ergebnis der Booleschen Funktion Parameter zu verwenden, etwa so:

insert :: (Ord a) => (a -> a -> Bool) -> a -> [a] -> [a] 
insert _ a [] = [a] 
insert f a (a':as) 
    | f a a' = a:a':as 
    | otherwise = a':insert f a as 

Ähnlich für die andere Funktion.

insertionSort :: (Ord a) => (a -> a -> Bool) -> [a] -> [a] 
insertionSort _ []  = [] 
insertionSort f (a:as) = insert f a (insertionSort f as) 

Demo

+0

Vielen Dank! Ich habe gelesen, dass (Ord a), (>) und (a-> a-> Bool) alle gleichwertig sind. Ist das korrekt? Und wenn ja, warum brauchst du (insert :: (Ord a) => (a-> a-> Bool) -> a ...) anstelle von (insert :: (a-> a-> Bool) - > a ...)? – GabbaGandalf

+3

@GabbaGandalf Keine von ihnen ist gleichwertig. '(Ord a) => ...' besagt, dass a ein bestellbarer Datentyp sein muss. '(>)' ist eine Funktion. Es ist dasselbe wie das Schreiben von '(\ a b -> a> b)'. Schließlich ist '(a -> a -> Bool)' eine Typbeschreibung: Sie beschreibt eine Funktion, die 2 Werte vom Typ 'a' akzeptiert und einen 'Bool' zurückgibt. –

+0

Danke, gut zu wissen. Die Anweisung (Ord a) => ... verhindert also nur Laufzeitfehler? – GabbaGandalf