【发布时间】:2023-03-20 11:17:01
【问题描述】:
我有一张地图(Map (Int,Int) Int)(叫它Mapp)。我想创建一个函数mod :: Mapp -> [(Int,Int,Int)] -> Mapp,它为给定列表的每个三元组(a,b,c)设置Mapp[(a,b)] = c。怎么做?
【问题讨论】:
标签: haskell
我有一张地图(Map (Int,Int) Int)(叫它Mapp)。我想创建一个函数mod :: Mapp -> [(Int,Int,Int)] -> Mapp,它为给定列表的每个三元组(a,b,c)设置Mapp[(a,b)] = c。怎么做?
【问题讨论】:
标签: haskell
mod = foldr (\(a, b, c) -> Map.insert (a, b) c)
这个想法很简单:我们可以使用fold函数从列表中一个一个地插入元素。
【讨论】:
import qualified Data.Map as M
mod :: (Ord k0, Ord k1) => M.Map (k0, k1) a -> [(k0, k1, a)] -> M.Map (k0, k1) a
mod m l = M.fromList (map (\(a,b,c) -> ((a,b),c)) l) `M.union` m
解释:将你的列表 l 的三元组 (a,b,c) 更改为 ((a,b),c)。
map (\(a,b,c) -> ((a,b),c)) l
使用新列表,制作新地图。
M.fromList (map (\(a,b,c) -> ((a,b),c)) l)
然后使用M.union将上面的新地图和旧的m联合起来:
M.fromList (map (\(a,b,c) -> ((a,b),c)) l) `M.union` m
由于M.union 是左偏的,左图中的关联优先于右图中的关联,有效地用新值替换旧值。
【讨论】: