给定两个列表,我可以生成这两个列表的笛卡尔积的所有排列的列表:

permute :: [a] -> [a] -> [[a]]
permute xs ys = [ [x, y] | x <- xs, y <- ys ]

Example> permute [1,2] [3,4] == [ [1,3], [1,4], [2,3], [2,4] ]

我如何扩展置换,以便代替两个列表,而取一个列表(长度为n)的列表并返回一个列表(长度为n)的列表
permute :: [[a]] -> [[a]]

Example> permute [ [1,2], [3,4], [5,6] ]
            == [ [1,3,5], [1,3,6], [1,4,5], [1,4,6] ] --etc

我在Hoogle上找不到任何相关的内容。唯一与签名匹配的函数是transpose,它无法产生所需的输出。

编辑:我认为这的2列表版本本质上是Cartesian Product,但我不能全神贯注于实现n-ary Cartesian Product。有指针吗?

最佳答案

Prelude> sequence [[1,2],[3,4],[5,6]]
[[1,3,5],[1,3,6],[1,4,5],[1,4,6],[2,3,5],[2,3,6],[2,4,5],[2,4,6]]

10-08 15:10