我有以下元组列表:
列表1:
[("key-1", Type1, Type2, Type3), ("key-2", Type1, Type2, Type3)]列表2:
[("key-1", Type4), ("key-2", Type4)]我希望将这些元组按其第一个组件合并,以便产生以下结果:
结果列表:
[("key-1", Type1, Type2, Type3, Type4), ("key-2", Type1, Type2, Type3, Type4)]我可以以何种方式创建结果列表?
发布于 2022-07-21 08:27:54
在一般情况下,我将采用转换为地图的方法:
import Data.Map (Map)
import qualified Data.Map as Map
merge :: Ord a => [(a,b,c,d)] -> [(a,e)] -> [(a,b,c,d,e)]
merge left right = let
mleft = Map.fromList $ map (\(k, a,b,c) -> (k, (a,b,c))) left
mright = Map.fromList right
mergeL (a, b, c, d) acc = case Map.lookup a mright of
Nothing -> acc -- can't merge
Just e -> (a, b, c, d, e) : acc
in foldr mergeL [] left注意,这将消除两个列表中都不存在的键。如果您需要保留那些可以为Nothing情况生成具有某些默认值的条目,则添加外观类似的mergeR并将两个foldr连接起来。
https://stackoverflow.com/questions/73060753
复制相似问题