[英]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.