如果您不是在谈论寻找结果相交。
对于每两个列表,我们可以使用来自Data.List 的intersect 函数,该函数取它们的交集。
所以,想法是计算所有列表的交集并对它们进行排序。
> snd . last . sort $ [ (length $ intersect x y, (x,y)) | let list = [[1,1,2,2,1,2,2,1],[2,2,1,2,2,1,1,3],[8,4,4,4,4,9,8,4]], x <- list, y <- list, x /= y ]
([1,1,2,2,1,2,2,1],[2,2,1,2,2,1,1,3])
如果您有兴趣创建后交集,可以使用类似的方法:
import Data.List (sort, subsequences)
intersectCons :: (Ord a) => [a] -> [a] -> [a]
intersectCons x y = snd . last . sort $
[ (length x1, x1) | x1 <- subsequences x
, x2 <- subsequences y
, x1 == x2 ]
例如:
> intersectCons [1, 1, 2, 2, 1, 2, 2, 1] [2, 2, 1, 2, 2, 1, 1, 3]
[2,2,1,2,2,1]
我们还可以使用它来查找最相似的列表对:
> snd . last . sort $ [ (length $ intersectCons x y, (x,y)) | let list = [[1,1,2,2,1,2,2,1],[2,2,1,2,2,1,1,3],[8,4,4,4,4,9,8,4]], x <- list, y <- list, x /= y ]
([2,2,1,2,2,1,1,3],[1,1,2,2,1,2,2,1])
实际上,如果您不仅想获取一对列表,还想获取所有“相似”的对,您可以删除snd . last . sort $ 并获取所有列表。