我现在已经看了一段时间,但我无法找到如何做到这一点。假设我有两个列表,我想返回一个新列表,该列表与zip
的结果相同但没有重复列表,例如,给定[1,2,3]
和[4,5,6]
,结果将为{ {1}}。我会这样做(支持编译器不会产生错误):
[1,4,2,5,3,6]
PS:必须使用列表理解。
你可以对此有所了解吗?
答案 0 :(得分:2)
你可能想要-XParallelListComp
这是zip的语法糖。除了糖之外,解决方案与已经提出的建议相符:
{-# LANGUAGE ParallelListComp #-}
xs = [1..3]
ys = [4..6]
ls = concat [ [x,y] | x <- xs | y <- ys ]
结果:
*Main> ls
[1,4,2,5,3,6]
答案 1 :(得分:2)
这也可以在没有扩展名的情况下方便地完成:
myFunc xs ys = [x | pairs <- transpose [xs, ys], x <- pairs]
这不会像Thomas M. DuBuisson的回答那样抛弃元素;例如myFunc [] [1]
将是[1]
,而不是[]
。当然,这是否可取取决于您的需求。
但更简单的是根本不使用列表推导,因此您无需为中间人pairs
命名。
myFunc xs ys = concat (transpose [xs, ys])
答案 2 :(得分:1)
func a b = concat (map ( \(x,y) -> [x,y] ) (zip a b))
你的意思是这样吗?