我正在尝试构建一个函数,该函数将从列表中删除所有重复项。假设我从列表[1,2,1,3,2,4]开始,我只想得到没有重复元素的[3,4]。如何在不使用elem
的情况下重写以下代码?
rmds :: (Eq a) => [a] -> [a]
rmds [] = []
rmds [x] = [x]
rmds (x:xs)
| elem x (xs) = [k|k <- rmds (xs) , k /= x]
| otherwise = x : [c| c <- rmds (xs), c /=x]
您可以使用\
运算符来实现您想要的:
import Data.List
rmds :: Ord a => [a] -> [a]
rmds [] = []
rmds [x] = [x]
rmds zs@(x:y:xs) = zs \ dups zs
where dups = concat . filter ((>1) . length) . group . sort
这里的核心思想是找到列表中的所有重复项,然后使用\
从原始列表中删除所有重复项。
如果您删除该测试,您的代码将实际工作。
rmds :: Eq a => [a] -> [a]
rmds [] = []
rmds [x] = [x]
rmds (x:xs) = x : [c | c <- rmds xs, c /= x]
你明白为什么吗?您也不需要[x]
的特殊情况。你能理解为什么吗?