给定两个列表,我可以产生这两个列表的Cartesian积:
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] ]
如何扩展permute,使其不再接受两个列表,而是接受一个长为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
,但它无法产生所需的输出。
sequence
的意思是“对于第一个列表中的每个元素,在剩余列表上进行序列化并将其添加到每个列表的开头”。基本上,这是使用右折叠写笛卡尔积的最明显的方法。 - C. A. McCann