Sorting 根据谓词对haskell中的列表进行排序
我正在努力学习Haskell,我在尝试完成一个示例问题时遇到了一些问题。问题是根据给定的谓词对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 =
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
。我错了,你可以用。