我有一个有趣的问题来弄清楚涉及嵌套列表推导。我将为这篇文章编写不必要的细节,因此我试图解决的问题可能看起来有点奇怪。
我有两个元组,如下("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"]
也是有效的组合
答案 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"]