Haskell:列表问题

时间:2011-06-19 12:32:14

标签: math haskell combinatorics

  

可能重复:
  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]]]

3 个答案:

答案 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]]]