列表理解列表中的元组列表

时间:2018-05-08 15:09:00

标签: list haskell list-comprehension

Haskell中是否有任何函数或方法可以帮助我获取元组列表,例如[(1,2),(3,4),(5,6)]
返回[1,2,3,4,5,6]并使用列表理解?

我专门搜索一个带参数xs
的函数 在身体(功能)中有一个列表理解。

3 个答案:

答案 0 :(得分:7)

鉴于元组列表名为ts,我们可以执行两次迭代:

[ t | (a, b) <- ts, t <- [a, b] ]

所以在这里我们首先遍历(a, b)中的元组ts,接下来我们构建一个新列表[a, b],然后我们迭代该列表,然后我们得到{{1对于t中的每个t

或者使用无点列表monad:

[a, b]

答案 1 :(得分:2)

当然,您可以处理任何列表,甚至是列表解析中的元组列表。这是不同的形式。在此之前,你会看到两个很好的答案,形式是(a,b)或(x,y)。这两者意味着相同。它们意味着元组中的两个元素。处理元组表单的问题是输出是单独的两个项目列表。这就是concat非常有价值的原因。

我非常喜欢列表推导,并且上面给出了用列表理解来展平任何类型列表的经典形式。

我对Haskell相对较新,并且无法理解fold如何生成列表,而不是像sumproduct那样的单个值。

这样的问题非常宝贵,因为它们有助于我理解。

foldr版本会产生一个列表。你想要的清单。为什么它是一个列表而不是单个值?这是因为foldr产生了一系列连续越来越大的列表,其中最后一个是答案。

这是用于展平元组列表的函数的foldr版本。

foldr (\(a,b) l-> a:b:l) []    [(1,2),(3,4),(5,6)]

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

答案 2 :(得分:1)

concatMap (\(x, y) -> [x, y]) [(1,2),(3,4),(5,6)]

将给出

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

如果您不想使用concatMap,可以

concat . map (\(x, y) -> [x, y])