簡體   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