Haskell中是否有任何函数或方法可以帮助我获取元组列表,例如[(1,2),(3,4),(5,6)]
和
返回[1,2,3,4,5,6]
并使用列表理解?
我专门搜索一个参数xs
和
在身体(功能)中有一个列表理解。
鉴于元组列表名为ts
,我们可以执行两次迭代:
[ t | (a, b) <- ts, t <- [a, b] ]
所以在这里我们首先迭代(a, b)
中的元组ts
,然后我们构建一个新的列表[a, b]
,我们也迭代该列表,并且我们为t
中的每个t
产生[a, b]
。
或者使用无点列表monad:
(>>= uncurry ((. pure) . (:)))
当然,您可以处理任何列表,甚至是列表理解中的元组列表。这是不同的形式。在此之前,你会看到两个很好的答案,形式是(a,b)或(x,y)。这两者意味着相同。它们意味着元组中的两个元素。处理元组表单的问题是输出是单独的两个项目列表。这就是concat
如此珍贵的原因。
我非常喜欢列表推导,并且上面给出了用列表理解来展平任何类型列表的经典形式。
我对Haskell相对较新,并且无法理解fold
s如何生成列表而不是像sum
或product
这样的单个值。
这样的问题非常宝贵,因为它们有助于我理解。
这个foldr
版本会产生一个列表。你想要的清单。为什么它是一个列表而不是单个值?这是因为foldr
产生了一系列连续越来越大的列表,其中最后一个是答案。
这是一个foldr
版本的函数来展平元组列表。
foldr (\(a,b) l-> a:b:l) [] [(1,2),(3,4),(5,6)]
[1,2,3,4,5,6]
concatMap (\(x, y) -> [x, y]) [(1,2),(3,4),(5,6)]
会给
[1,2,3,4,5,6]
如果您不想使用concatMap
,您可以这样做
concat . map (\(x, y) -> [x, y])