2016-05-17 4 views
1

私は毎週の大学の割り当てのためにhaskellで挿入のソートを実装しようとしています。これは私のインサートとソート機能である:指定された順序でHaskellのInsertionsort

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) 

これは動作しますが、私の家庭教師はそうのような署名を指定:iを試してみました

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

すべてが今失敗し、コンパイラエラーはどちらか本当に参考になっていません。あなたたちがこれで私を助けてくれることを願っています!

編集:

与えられた例私の家庭教師によってはそうのようになります。

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 ::(a-> a-> Bool)の代わりに(insert ::(a-> a-Bool) - > a ...) > a ...)? – GabbaGandalf

+3

@ GabbaGandalfどれも同等ではありません。 '(Ord a)=> ...'は、注文可能なデータ型である必要があると述べています。 '(>)'は関数です。これは '(\ a b - > a> b)'と同じです。最後に '(a - > a - > Bool)'は型記述です。これは 'a'型の2つの値をとり、' Bool'を返す関数を記述します。 –

+0

ありがとう、よく知っておいてください。だから、ステートメント(Ord a)=> ...は実行時エラーを防ぎますか? – GabbaGandalf

関連する問題