2016-05-17 6 views
1

Я пытаюсь внедрить сортировку вставки в haskell для моего еженедельного университетского задания. Это моя вставка и вид функции:Insertionsort в Haskell с заданным заказом

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) 

Это работает, но мой учитель указан подпись так:

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

Все я пытался теперь не удалось, и ошибки компилятора не очень полезно либо. Надеюсь, вы, ребята, можете мне помочь!

Edit:

Данный пример моего наставника выглядит так:

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] 

ответ

2

Все, что вам нужно сделать, это использовать результат булевой параметра функции вместо фиксированного сравнения, например, так:

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 

Аналогичным образом для другой функции.

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

Demo

+0

Большое спасибо! Я читал, что (Ord a), (>) и (a-> a-> Bool) эквивалентны. Это верно? И если да, зачем вам (insert :: (Ord a) => (a-> a-> Bool) -> a ...) вместо (insert :: (a-> a-> Bool) - > а ...)? – GabbaGandalf

+3

@GabbaGandalf Ни один из них не эквивалентен. '(Ord a) => ...' заявляет, что a должен быть упорядоченным типом данных. '(>)' является функцией. Это то же самое, что писать '(\ a b -> a> b)'. Наконец '(a -> a -> Bool)' является описанием типа: он описывает функцию, которая принимает 2 значения типа 'a' и возвращает' Bool'. –

+0

Спасибо, приятно знать. Итак, утверждение (Ord a) => ... просто предотвращает ошибки во время выполнения? – GabbaGandalf