将两个元组与嵌套列表理解相结合

时间:2017-08-27 02:54:45

标签: haskell list-comprehension

我有一个有趣的问题来弄清楚涉及嵌套列表推导。我将为这篇文章编写不必要的细节,因此我试图解决的问题可能看起来有点奇怪。

我有两个元组,如下("X", "Y", "Z")("1", "2")。这些内容只能如上所述。

使用这两个列表,我需要构建一个3元组的列表,以及上述两个列表的每个组合。其中一个元组的示例是("X2", "Z2", "Y1)。请注意,这些数字总是在字母后面。

我知道我需要使用列表理解,但似乎我需要以某种方式拥有嵌套列表理解,这是我不熟悉的。

我从这开始:

[(comb1, comb2, comb2) | {- What goes here? -}]

我不知道该怎么办。如何使用嵌套列表推导解决此问题?我相信嵌套列表理解是解决这个问题的最佳方法,但如果你知道更好的方法,请解释一下。

编辑并提供更多详细信息:

这个元组列表将由一个看起来像这样的函数输出:

init :: [(String, String, String)]
init = [(comb1, comb2, comb3) | {- What goes here? -}]

init函数的返回值将用于需要在此3元组列表上执行任务的较大程序的上下文中。实际的两个元组("X", "Y", "Z")("1", "2")将被硬编码到init函数的列表解析中。

除了笛卡尔产品之外,还有更多的组合。笛卡尔积将导致[["X1","Y1","Z1"],["X2","Y2","Z2"]]。但是,这些字母不一定是有序的,有些字母可能根本不会出现在其中一个结果中。 ["Z1", "X2", "X1"]也是有效的组合

1 个答案:

答案 0 :(得分:1)

它总是一个3元组和一个2元组吗?如果是这样,你也可以直接计算:

getInit (a,b,c) (x,y) =
  [ (a++x,b++x,c++y)
  , (a++y,b++y,c++y)
  ]

但是,如果您可以使用列表,则有多种方法可以执行Cartesian product

[[x++y | x <- ["A","B","C"]] | y <- ["1","2"]]

或者,如果您更喜欢monads列出理解:

import Control.Monad

combos = liftM2 (++)
init = combos ["A","B","C"] ["1","2"]