为什么不给出正确的输出?

use*_*008 0 haskell

count :: Eq a => a -> [a] -> Int
count _[]                  = 0
count z (x:xs) | z == x    = 1 + (count z xs)
               | otherwise = count z xs

rmdups :: Eq a => [a] -> [a]
rmdups [] = []
rmdups (x:xs) | count x xs > 0 = rmdups xs
              | otherwise     = x: rmdups xs
Run Code Online (Sandbox Code Playgroud)

上面的代码编译,但是当我输入'ababca'rmdups的输出时'bca',我希望它是'abc'.为什么去那里?我一直在改变代码,并且不知道为什么会这样做.

Cat*_*lus 10

因为您从前面删除重复项.您可以修改rmdupsxs在继续之前过滤掉,因此从尾部中删除重复项:

rmdups :: Eq a => [a] -> [a]
rmdups [] = []
rmdups (x:xs)
    | count x xs > 0 = x : (rmdups $ filter (/= x) xs)
    | otherwise      = x : rmdups xs
Run Code Online (Sandbox Code Playgroud)

事实上,你甚至可以在没有预先计数的情况下做到这一点:

rmdups :: Eq a => [a] -> [a]
rmdups []       = []
rmdups (x : xs) = x : filtered
                where filtered = rmdups $ filter (/= x) xs
Run Code Online (Sandbox Code Playgroud)

当然,在实际代码中,在这种情况下,您应该更喜欢已经可用的功能Data.List.nub.