2016-05-06 3 views
1

Это реализация Mergesort с использованием функций более высокого порядка, охранников, где и рекурсия.Haskell Merge Sort

Однако получаю сообщение об ошибке от компилятора 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 

Я не могу видеть, что случилось? или, скорее, я не понимаю компилятор.

+1

кстати - если вы используете длину это O (п) операции - так вы производите ненужные накладные расходы, в общем, если вы используете длину индексации много с (один-сшитым) перечисляет вы, вероятно, с помощью неправильная структура данных. – epsilonhalbe

ответ

1

Haskell - это язык программирования, чувствительный к отступу, вам просто нужно исправить это (кстати, если вы используете изменения табуляции, чтобы использовать пробелы).

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

, который, похоже, исправил эту ошибку, но теперь, когда я запускаю функцию mergeSort, он говорит, что слияние не в области видимости. Означает ли это, что код является неполным, и мне нужно дополнительно определить, что такое слияние на самом деле? – emuterisa

+0

nvm, глупый вопрос! извините xD – emuterisa

0

msort реализация в Хаскелле;

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 

 Смежные вопросы

  • Нет связанных вопросов^_^