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

Sorting 根据谓词对haskell中的列表进行排序,sorting,haskell,Sorting,Haskell,我正在努力学习Haskell,我在尝试完成一个示例问题时遇到了一些问题。问题是根据给定的谓词对Haskell中的列表进行排序,即类型为 sort :: (a -> a -> Bool) -> [a] -> [a] 到目前为止,我掌握的代码是: sort _ [] = [] sort f (x:xs) = let smaller = sort f (filter (f x) xs) bigger =

我正在努力学习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)
这将根据该谓词分解列表,但如何使用高阶谓词进行此操作?

您只需要使用
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

您只需使用
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

您只需使用
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

您只需使用
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

首先,您需要缩进
较小的
较大的
,以便传递
let
。其次,您可能想看看
not
函数。@bheklillr似乎可以像这样编译。是否应像
(非f x)
那样使用
not
功能?因为这会导致编译器错误。请尝试
(非(f x))
(非$f x)
f
不是
的参数,
f x
是您要给它的参数。啊,对不起,应该是
非。f x
,因为f
是两个参数的函数。上面的语法可以与lambda函数一起使用,比如
过滤器(\y->not$fxy)xs
。我的错误。您可能想使用。首先,您需要缩进
较小的
较大的
,以便传递
let
。其次,您可能想看看
not
函数。@bheklillr似乎可以像这样编译。是否应像
(非f x)
那样使用
not
功能?因为这会导致编译器错误。请尝试
(非(f x))
(非$f x)
f
不是
的参数,
f x
是您要给它的参数。啊,对不起,应该是
非。f x
,因为f
是两个参数的函数。上面的语法可以与lambda函数一起使用,比如
过滤器(\y->not$fxy)xs
。我的错误。您可能想使用。首先,您需要缩进
较小的
较大的
,以便传递
let
。其次,您可能想看看
not
函数。@bheklillr似乎可以像这样编译。是否应像
(非f x)
那样使用
not
功能?因为这会导致编译器错误。请尝试
(非(f x))
(非$f x)
f
不是
的参数,
f x
是您要给它的参数。啊,对不起,应该是
非。f x
,因为f
是两个参数的函数。上面的语法可以与lambda函数一起使用,比如
过滤器(\y->not$fxy)xs
。我的错误。您可能想使用。首先,您需要缩进
较小的
较大的
,以便传递
let
。其次,您可能想看看
not
函数。@bheklillr似乎可以像这样编译。是否应像
(非f x)
那样使用
not
功能?因为这会导致编译器错误。请尝试
(非(f x))
(非$f x)
f
不是
的参数,
f x
是您要给它的参数。啊,对不起,应该是
非。f x
,因为f
是两个参数的函数。上面的语法可以与lambda函数一起使用,比如
过滤器(\y->not$fxy)xs
。我错了,你可以用。