我想生成一个列表,列出从Haskell中的数字列表中选择两个的所有独特方法。因此,从列表[1,2,3]
我想[[1,2],[2,3],[1,3]]
。订单并不重要,所以我想避免同时生成[1,2]
和[2,1]
。
我目前的解决方案是:
pairs :: Ord a => [a] -> [[a]]
pairs x = nub $ map sort $ map (take 2) (permutations x)
然而,这并不是一个特别好的解决方案,它确实存在一些严重的性能问题。这个问题有一个简单而有效的解决方案吗?
答案 0 :(得分:1)
pairs xs = [[x1, x2] | (x1:xs1) <- tails xs, x2 <- xs1]
...假设列表开始是唯一的,或者你可以用nub
组合它。