Haskell-通过第一个组件合并两个元组列表



我有以下元组列表:

列表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)]

我可以用什么方式创建结果列表?

在一般情况下,我会采用转换为地图的方法:

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

最新更新