2

可能重复:
笛卡尔积

我是 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]]]
4

3 回答 3

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])]
于 2011-06-19T13:23:36.770 回答
1

我也是haskell的新手,这是我对您问题的解决方案,希望对您有所帮助:

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

我认为代码很直接地解释了自己:)

于 2011-06-19T12:58:16.890 回答
1

这很有趣。

sequence [[[1],[2],[3]] , [[4],[5],[6]]]
于 2011-06-19T16:44:34.410 回答