2011-06-19 74 views
2

可能重复:
Cartesian product哈斯克尔:问题列表

我的Haskell新手,我有一个问题。我想做一些函数,将列表的第一个元素并连接到第二个列表的所有元素,然后从第一个列表中获取第二个元素并执行相同的操作。 例如,我想利用: [[1],[2],[3])和[[4],[5],[6]] 和输出得到

[([1],[4]),([1],[5]),([1],[6]), 
([2],[4]),([2],[5]),([2],[6]), 
([3],[4]),([3],[5]),([3],[6])] 

的闭合我发现一个是转置

transpose [[1,2,3],[4,5,6]] 
[[1,4],[2,5],[3,6]] 

我将不胜感激任何帮助。

编辑: 对我感到羞耻。我找到了解决方案

[[x,y] | x <- [[1],[2],[3]], y <- [[4],[5],[6]]] 

哪个结果是:

[[[1],[4]],[[1],[5]],[[1],[6]],[[2],[4]],[[2],[5]],[[2],[6]],[[3],[4]],[[3],[5]],[[3],[6]]] 
+2

看起来像:http://stackoverflow.com/questions/4119730/cartesian-product – Kru

+0

感谢它正是我一直在寻找:) – ahaw

回答

1

我也新哈斯克尔,这里是我的解决你的问题,希望这是有帮助的:

f [] _ = [] 
f (x:xs) ys = zip (take (length ys) (repeat x)) ys ++ f xs ys 

我想该代码解释自己很直接:) :)

4
import Control.Applicative 

(,) <$> [[1],[2],[3]] <*> [[4],[5],[6]] 

--[([1],[4]),([1],[5]),([1],[6]),([2],[4]),([2],[5]),([2],[6]),([3],[4]),([3],[5]),([3],[6])] 

有关说明,请参见http://learnyouahaskell.com/functors-applicative-functors-and-monoids#applicative-functors

您还可以使用DO-符号,如列表不仅Applicative,但Monads,太:

do x<-[[1],[2],[3]]; y<-[[4],[5],[6]]; return (x,y) 

--[([1],[4]),([1],[5]),([1],[6]),([2],[4]),([2],[5]),([2],[6]),([3],[4]),([3],[5]),([3],[6])] 
1

这很有趣。

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