在Haskell中迭代所有对组合而不重复

时间:2015-01-28 11:27:51

标签: haskell functional-programming tuples combinations

在haskell中,给定一个元素列表xs,迭代重复所有对排列的最简单方法是:

[(x,y) | x <- xs, y <- xs]

我希望能够做同样的事情,但仅限于组合。如果x和y具有可比性,我可以做到

[(x,y) | x <- xs, y <- xs, x > y]

但我更喜欢更通用,更高效的解决方案(我知道,渐态复杂性将保持平方,但我们可以通过避免使用过滤条件来减少实际的运行时复杂性)

2 个答案:

答案 0 :(得分:17)

怎么样:

[ (x,y) | (x:rest) <- tails xs , y <- rest ]

答案 1 :(得分:0)

如果我为特定情况Math.Combinat.Sets.choose复制并简化k=2,则会给出

pairs :: [a] -> [[a]]
pairs []     = []
pairs (x:xs) = map (\y -> x:[y]) xs ++ pairs xs -- replace with \y -> (x,y) to get 2-tuples

>>> pairs [1,2,3]
[[1,2],[1,3],[2,3]]