gpt4 book ai didi

haskell - 有没有比联合 map 更好的相交方法?

转载 作者:行者123 更新时间:2023-12-02 11:23:59 26 4
gpt4 key购买 nike

最近我多次遇到这种模式。基本上,它会处理 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)。我的直觉是应该有一种方法只需两次遍历即可解决这个问题。

最佳答案

实际上它就在那里:Map.differenceWith 确实符合我的要求。这有点不直观,但基本上它采用了 asbs and 的实际差异,从而有机会将交集中的值包含到结果集。

因此这个

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)

可以重写为

baz :: (a -> b -> a) -> Map a -> Map b -> Map a
baz f as bs = Map.differenceWith (\a b -> Just (f a b)) as bs

简单...抱歉浪费了您的时间:)

关于haskell - 有没有比联合 map 更好的相交方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26609003/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com