如何将两个元素放在haskell的理解列表中

时间:2017-03-21 20:10:27

标签: haskell

我现在已经看了一段时间,但我无法找到如何做到这一点。假设我有两个列表,我想返回一个新列表,该列表与zip的结果相同但没有重复列表,例如,给定[1,2,3][4,5,6],结果将为{ {1}}。我会这样做(支持编译器不会产生错误):

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

PS:必须使用列表理解。

你可以对此有所了解吗?

3 个答案:

答案 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))

你的意思是这样吗?