可能重复:
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]]]
答案 0 :(得分: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-Notation,因为列表不仅是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 :(得分:1)
我也是haskell的新手,这是我的问题的解决方案,希望它有用:
f [] _ = []
f (x:xs) ys = zip (take (length ys) (repeat x)) ys ++ f xs ys
我认为代码很直接地解释了自己:)
答案 2 :(得分:1)
这很有趣。
sequence [[[1],[2],[3]] , [[4],[5],[6]]]