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

问题描述 投票:1回答:3

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

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

list haskell list-comprehension
3个回答
7
投票

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

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

所以在这里我们首先迭代(a, b)中的元组ts,然后我们构建一个新的列表[a, b],我们也迭代该列表,并且我们为t中的每个t产生[a, b]

或者使用无点列表monad:

(>>= uncurry ((. pure) . (:)))

2
投票

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

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

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

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

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

这是一个foldr版本的函数来展平元组列表。

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

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


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])
© www.soinside.com 2019 - 2024. All rights reserved.