1

我有一个列表列表,例如[[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

我在吠叫错误的树吗?还是只是对谓词的误解?

4

2 回答 2

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
于 2012-11-19T12:36:08.483 回答
2

这应该适合你。

removeListsWithDuplicates 使用一个助手 hasDuplicates 来过滤列表列表。简单的。

removeListsWithDuplicates :: [[Integer]] -> [[Integer]]
removeListsWithDuplicates ls = filter (not . hasDuplicates) ls

有重复。空列表没有重复项。如果第一个元素在列表的其余部分中重复或列表的其余部分有一些其他重复项,则具有多个元素的列表只有重复项。

hasDuplicates :: [Integer] -> Bool
hasDuplicates [] = False
hasDuplicates (x:xs) = any (==x) xs || hasDuplicates xs
于 2012-11-19T12:35:53.007 回答