我有一个列表列表,例如[[1,1,3],[1,2,4],[4,4,4],[5,6,7]]
我想删除所有包含重复元素的列表,例如[[1,2,4],[5,6,7]]
我当前的问题是为filter
的应用程序创建谓词。
我目前正在尝试根据该列表的预期长度测试已过滤列表的长度。但是,我正努力让它作为list
removeLoops :: [[Integer]] -> Integer -> [[Integer]]
removeLoops list vs = filter (genericLength(filter (==)) < vs) list
我是在叫错树吗?或者仅仅是对谓词的误解?
答案 0 :(得分:3)
我认为解决方案比你想象的要简单。您可以使用谓词过滤列表,该谓词测试给定列表是否有重复项:
ls = [[1,1,3],[1,2,4],[4,4,4],[5,6,7]]
filtered = filter hasNoDuplicates ls
然后剩下的就是找到一个合适的谓词。在这种情况下,nub
函数派上用场。此函数接受一个列表,并返回该列表而不重复。所以你可以说:
import Data.List (nub)
hasNoDuplicates l = l == nub l
答案 1 :(得分:2)
这应该适合你。
removeListsWithDuplicates ues helper hasDuplicates来过滤列表列表。简单。
removeListsWithDuplicates :: [[Integer]] -> [[Integer]]
removeListsWithDuplicates ls = filter (not . hasDuplicates) ls
hasDuplicates。空列表没有重复项。如果第一个元素在列表的其余部分重复,或者列表的其余部分有一些其他重复项,则包含多个元素的列表只有重复项。
hasDuplicates :: [Integer] -> Bool
hasDuplicates [] = False
hasDuplicates (x:xs) = any (==x) xs || hasDuplicates xs