鉴于两份名单,我可以生产
所有排列的列表
这两个列表的笛卡尔乘积:计算n元笛卡尔乘积
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包裹我的头。任何指针?
虽然序列不含解决亲嗯,我真的很感兴趣,这将如何工作。 [实施](http://haskell.org/ghc/docs/6.12.1/html/libraries/base-4.2.0.0/src/Control-Monad.html#sequence)使用单子;有没有一种方法可以在不使用monads的情况下计算产品? (例如,不包含单子的语言) – guhou 2010-08-02 12:18:37
@ BleuM937:对于monad列表,“sequence”的意思是“对于第一个列表中的每个元素,将其预先加入到通过排序剩余列表而获得的每个列表中”。这基本上是使用正确折叠编写笛卡尔产品的最明显方式。 – 2010-08-02 13:52:52