两个列表的替代排列

时间:2016-01-10 23:37:55

标签: haskell

我正试图获得两个没有固定长度的列表的替代排列,例如:

x = ["a","b","c"]
y = [1,2,3]

应该返回:

[(a,1),(b,2),(c,3)] , [(a,2),(b,3),(c,1)], [(a,3),(b,1),(c,2)]

通过列表推导我能够得到这个:

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

[("a",1),("a",2),("a",3),("b",1),("b",2),("b",3),("c",1),("c",2),("c",3)]

这不是我想要的

1 个答案:

答案 0 :(得分:4)

您只需要对两个列表中的一个进行置换,然后将每个排列与原始顺序中的另一个列表配对:

import Data.List (permutations)

bijections :: [a] -> [b] -> [[(a, b)]]
bijections xs ys = map (zip xs) (permutations ys)

这样做会产生ys的所有排列(因此对于您的示例来说是[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]),然后对于每个排列,它将它们与xs对齐原始订单。