我正在努力学习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)
这会根据该谓词拆分列表,但是如何使用更高阶的谓词呢?
答案 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