繁体   English   中英

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

[英]Haskell - Merge two lists of tuples by first component

我有以下元组列表:

清单 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)]

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

如何使用zipWith

main = print $ merge list1 list2
-- [("key-1",0,True,"a string",'a'),("key-2",1,False,"another string",'b')]

merge :: [(a,b,c,d)] -> [(a,e)] -> [(a,b,c,d,e)]
merge = zipWith $ \(a,b,c,d) (_,e) -> (a,b,c,d,e)

list1 = [("key-1", 0, True, "a string"), ("key-2", 1, False, "another string")]
list2 = [("key-1", 'a'), ("key-2", 'b')]

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM