如何在Haskell中创建Insert_sort高阶函数

时间:2015-04-29 02:01:52

标签: haskell

请注意我的代码

insert x [] = [x]
insert x (y:ys)
    | x < y = x:y:ys
    | x == y = y:ys ++ [x]
    | otherwise = y:insert x ys

insert_sort [] = []
insert_sort (x:xs) = insert x (insert_sort xs)

insert_pair (x,y) [] = [(x,y)]
insert_pair (x,y) ((a,b):yd)
                     | x > a = (a,b):insert_pair (x,y) yd
                     | otherwise = (x,y):(a,b):yd

insert_sort_pair [] = []
insert_sort_pair (x:xs) = insert_pair x (insert_sort_pair xs)

insert_high f [] = []
insert_high f (x:y:ys)
            | f x y = x:y:ys
            | otherwise = y:insert x ys
insert_high f ((a,b):(c,d):yd)
            | f a c = (a,b):insert_pair (c,d) yd
            | otherwise = (a,b):(c,d):yd

insert_sort_high f [] = []
insert_sort_high f (x:xs) = insert_high (f) x (insert_sort_high (f) xs)

我想使insert_sort-high可以同时执行insert_sort和insert_pair_sort。 &#34; insert_sort_pair&#34;比较(数字,符号)中的数字。 例如:

insert_sort_high (<) [3,5,2,1,4] -> [1,2,3,4,5]
insert_sort_high (>) [(2,'a'),(3,'b'),(1,'c')] -> [(1,'c'),(2,'a'),(3,'b')]

但是,它不起作用......我该如何解决它?

1 个答案:

答案 0 :(得分:3)

首先,一个根本的误解。

insert_high写一个类型 - 它应该是(a -> a -> Bool) -> [a] -> [a]。但是你已经为元组列表写了一个专门化,所以你强迫它不那么一般。

您只能涵盖一般情况。你被你的例子误导了。

我认为你真正想要的是

λ insert_sort_high (<) [3,5,2,1,4]
[1,2,3,4,5]
λ insert_sort_high (\(x,y) (a,b) -> x < a) [(2,'a'), (3,'b'), (1,'c')]
[(1,'c'),(2,'a'),(3,'b')]

后者可以更轻松地写成

λ :m +Data.Function
λ insert_sort_high ((<) `on` fst) [(2,'a'), (3,'b'), (1,'c')]
[(1,'c'),(2,'a'),(3,'b')]

当然,只有当你只想要排序在该对的第一个元素上时才会这样。

λ insert_sort_high ((<) `on` fst) [(2,'a'), (3,'b'), (1, 'a'), (1,'b'), (1,'c'), (1,'a')]
[(1,'a'),(1,'c'),(1,'b'),(1,'a'),(2,'a'),(3,'b')]

如果你想按整个对排序,你也可以这样做

λ (1,'a') < (1,'b')
True
λ (1,'z') < (2,'a')
True
λ insert_sort_high (<) [(2,'a'), (3,'b'), (1,'a'),(1,'b'),(1,'c'), (1,'a')]
[(1,'a'),(1,'a'),(1,'b'),(1,'c'),(2,'a'),(3,'b')]

但我离题了。

考虑到这一点,你真正需要做的就是删除你的元组大小写,并清除一些拼写错误。

insert_high :: (a -> a -> Bool) -> a -> [a] -> [a]                   
insert_high _ x [] = [x]                                             
insert_high f x (y:ys)                                               
            | f x y = x:y:ys                                         
            | otherwise = y : insert_high f x ys                     

insert_sort_high _ [] = []                                           
insert_sort_high f (x:xs) = insert_high f x (insert_sort_high f xs)