【问题标题】:Haskell: Cartesian product [duplicate]Haskell:笛卡尔积[重复]
【发布时间】:2011-09-18 03:28:35
【问题描述】:

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

我发现的closes是转置

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

【问题讨论】:

标签: haskell math combinatorics cartesian-product


【解决方案1】:

这很有趣。

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

【讨论】:

    【解决方案2】:
    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])]
    

    【讨论】:

      【解决方案3】:

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

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

      我认为代码解释得很直接:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-22
        • 2012-02-24
        • 2016-05-07
        • 2012-04-24
        • 2016-06-26
        • 2023-04-10
        • 2011-02-06
        • 2014-06-18
        相关资源
        最近更新 更多