Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 如何删除具有列表的函数中的重复元素?_List_Function_Haskell_Element_Ghci - Fatal编程技术网

List 如何删除具有列表的函数中的重复元素?

List 如何删除具有列表的函数中的重复元素?,list,function,haskell,element,ghci,List,Function,Haskell,Element,Ghci,说到哈斯克尔,我是个新手,有几件事让我感到困惑。我正在尝试删除此函数列表中的重复元素: qsort :: [Int] -> [Int] qsort [] = [] qsort (x:xs) = qsort smaller ++ [x] ++ qsort larger where smaller = [a | a <- xs, a <= x] larger = [b | b <- xs, b > x]

说到哈斯克尔,我是个新手,有几件事让我感到困惑。我正在尝试删除此函数列表中的重复元素:

qsort :: [Int] -> [Int]
qsort [] = []
qsort (x:xs) = 
     qsort smaller ++ [x] ++ qsort larger
     where 
          smaller = [a | a <- xs, a <= x] 
          larger = [b | b <- xs, b > x]
但是,如果我进行qsort[2,6,3,3],它仍然返回[2,3,3,6]

我使用的nub函数是错误的还是缺少了其他东西


谢谢

您的示例显示您只在空列表(
nub[]
)上使用了
nub
,实际上没有任何作用。您必须将其应用于
qsort
主体的结果:

qsort :: [Int] -> [Int]
qsort [] = []
qsort (x:xs) = 
     nub $ qsort smaller ++ [x] ++ qsort larger
     where 
          smaller = [a | a <- xs, a <= x] 
          larger = [b | b <- xs, b > x]
qsort::[Int]->[Int]
qsort[]=[]
qsort(x:xs)=
nub$qsort较小+++[x]++qsort较大
哪里
较小=[a | a正如在回答中指出的,您需要在最终排序的列表上应用
nub
。不幸的是,此函数是
O(n^2)
,如果列表变长,将非常无效

如果您将相同的元素组合在一起并只取第一项,这只是一个
O(n)
操作,则可以将总体复杂度提高到
O(nlogn)
(排序成本)。您可以通过
map
group
head
功能来实现这一点

根据这些建议,下面是编写函数的另一种方法:

qsort :: [Int] -> [Int]
qsort [] = nub[]
import Data.List

qsort :: (Ord a) => [a] -> [a]
qsort [] = []
qsort (pivot:others) = map head $ group $ qsort lowers ++ [pivot] ++ qsort highers
    where lowers = filter (<pivot) others
          highers = filter (>=pivot) others

请参阅(unique)[软件包中的
unique
功能


为什么要在
qsort[]=nub[]
中编写
[]
*Main> qsort [2, 6, 3, 3]
[2,3,6]
unique [2,3,6,6,3]
[2,3,6]