2016-05-06 8 views
1

Dies ist eine Implementierung von Mergesort mit Funktionen höherer Ordnung, Wachen, wo und Rekursion.Haskell Merge Sort

jedoch einen Fehler von Compiler bekommen 6:26: parse error on input ‘=’

mergeSort :: ([a] -> [a] -> [a]) -> [a] -> [a] 
    mergeSort merge xs 
     | length xs < 2 = xs 
     | otherwise = merge (mergeSort merge first) (mergeSort merge second) 
     where first = take half xs 
       second = drop half xs 
       half = (length xs) `div` 2 

ich nicht, was falsch sehen kann? oder ich verstehe den Compiler nicht.

+1

btw - wenn Sie Länge verwenden dies ist ein O (n) -Operation - so sind Sie unnötigen Aufwand produzieren in der Regel, wenn Sie viel mit (Single-linked) listet mit Länge Indizierung werden Sie wahrscheinlich verwenden die falsche Datenstruktur. – epsilonhalbe

Antwort

1

Haskell ist eine indentation-sensitive Programmiersprache, die Sie einfach reparieren müssen (wenn Sie Tabulatoren verwenden, ändern Sie das zur Verwendung von Leerzeichen).

mergeSort :: ([a] -> [a] -> [a]) -> [a] -> [a] 
mergeSort merge xs 
     | length xs < 2 = xs 
     | otherwise = merge (mergeSort merge first) (mergeSort merge second) 
     where first = take half xs 
       second = drop half xs 
       half = length xs `div` 2 
+0

scheint diesen Fehler behoben zu haben, aber jetzt, wenn ich die Funktion mergeSort ausführen, sagt es merge nicht im Bereich. Heißt das, der Code ist unvollständig und ich muss weiter definieren, was Merge eigentlich macht? – emuterisa

+0

nvm, dumme Frage! Entschuldigung xD – emuterisa

0

Weitere msort Implementierung in Haskell;

merge :: Ord a => [a] -> [a] -> [a] 
merge [] ys   = ys 
merge xs []   = xs 
merge (x:xs) (y:ys) | x < y  = x:merge xs (y:ys) 
        | otherwise = y:merge (x:xs) ys 

halve :: [a] -> ([a],[a]) 
halve xs = (take lhx xs, drop lhx xs) 
      where lhx = length xs `div` 2 

msort :: Ord a => [a] -> [a] 
msort [x] = [x] 
msort xs = merge (msort left) (msort right) 
      where (left,right) = halve xs