根据过滤器的输出进行过滤

时间:2012-11-19 12:17:43

标签: haskell

我有一个列表列表,例如[[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
我是在叫错树吗?或者仅仅是对谓词的误解?

2 个答案:

答案 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