根据谓词对haskell中的列表进行排序

时间:2015-01-15 18:53:53

标签: sorting haskell

我正在努力学习Haskell,并且在尝试完成示例问题时遇到了问题。问题是根据给定的谓词在Haskell中对列表进行排序,即类型是

sort :: (a -> a -> Bool) -> [a] -> [a]

我到目前为止的代码是:

sort _ [] = []
sort f (x:xs) =
            let 
            smaller = sort f (filter (f x) xs)
            bigger = sort f (filter (f x) xs) --error is on this line 
            in smaller ++ [x] ++ bigger

代码在某种意义上不能正常工作我不知道如何采取相反的功能。例如,如果它是一个普通的排序函数,我会使用smaller = quicksort (filter (<=x) xs)bigger = quicksort (filter (>x) xs)这会根据该谓词拆分列表,但是如何使用更高阶的谓词呢?

1 个答案:

答案 0 :(得分:3)

你只需要使用not函数来反转你的布尔值:

not :: Bool -> Bool

f :: a -> a -> Bool
f x :: a -> Bool

not . f x :: a -> Bool

并且您将其用作

sort _ [] = []
sort f (x:xs) =
    let smaller = sort f (filter (f x) xs)
        bigger  = sort f (filter (not . f x) xs)
    in smaller ++ [x] ++ bigger