我正在尝试从Integer列表中以这种形式设置元组列表: (a,b)a <-[1..4]和b <-xs。但是我不断得到语句的所有不同组合。
okTup :: [Int] -> [(Int,Int)]
okTup xs = [(i,j) | i <- [1..4], j <- xs]
输入:okTup [3,1,4,2]
我得到的是: [(1,3),(1,1),(1,4),(1,2,2,(2,3),(2,1),(2,4),(2,2),( 3,3),(3,1),(3,4),(3,2),(4,3),(4,1),(4,4),(4,2)]
但是我只想要这个: [(1, 3 ),(2, 1 ),(3, 4 ),(4, 2 )]
答案 0 :(得分:9)
即zip
:
okTup xs = zip [1..] xs
如果您更喜欢使用列表理解,或者想扩展现有的理解,则可以使用ParallelListComp
扩展名,它允许您编写:
okTup xs = [(i, j) | i <- [1..] | j <- xs]
(请注意,竖线|
而不是逗号,
。)
当然,这实际上只是在幕后使用zip
。