构建自己的函数,从Haskell中的列表中删除重复的元素



我正在尝试构建一个函数,该函数将从列表中删除所有重复项。假设我从列表[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]的特殊情况。你能理解为什么吗?

最新更新