2
最近我遇到过这种模式几次。基本上它处理as
中的所有密钥,这些密钥也存在于bs
中,并且不会触及其他密钥。有没有更好的方式相交然后联合地图?
foo :: (a -> b -> a) -> Map a -> Map b -> Map a
foo f as bs = (Map.intersectionWith f as bs) `Map.union` (Map.difference as bs)
由于对union
这种性质可缩短为:
bar :: (a -> b -> a) -> Map a -> Map b -> Map a
bar f as bs = Map.intersectionWith f as bs `Map.union` as
但仍然这就要求三个遍历(二过as
一个超过bs
)。我的直觉是,只有两次遍历才能解决这个问题。
也许很一般['mergeWithKey'(HTTP: //hackage.haskell.org/package/containers-0.5.5.1/docs/Data-Map-Lazy.html#v:mergeWithKey)函数可以用于此。 – chi 2014-10-28 13:13:26
我会尝试在chi链接处给出的myIntersectionWithKey示例中替换第一个*(const empty)* by * id *。 – 2014-10-28 13:30:48