Haskell中是否有任何函数或方法可以帮助我获取元组列表,例如[(1,2),(3,4),(5,6)]
和
返回[1,2,3,4,5,6]
并使用列表理解?
我专门搜索一个带参数xs
和
的函数
在身体(功能)中有一个列表理解。
答案 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
如何生成列表,而不是像sum
或product
那样的单个值。
这样的问题非常宝贵,因为它们有助于我理解。
此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])