如何在Haskell中合并不同类型的地图?
我正在寻找一个Haskell函数,它结合了两种不同类型的映射。例如如何在Haskell中合并不同类型的地图?,haskell,Haskell,我正在寻找一个Haskell函数,它结合了两种不同类型的映射。例如 mergeWith :: (a -> b -> c) -> Map k a -> Map k b -> Map k c 我希望它的行为类似于SQL中的内部联接 不剪切它,因为它要求两个贴图具有相同类型的值 有这样的功能吗?如果没有,最有效的方法是什么?这是我自己能做的最好的方法 import qualified Data.Map.Strict as M mergeWith :: (Ord k)
mergeWith :: (a -> b -> c) -> Map k a -> Map k b -> Map k c
我希望它的行为类似于SQL中的内部联接
不剪切它,因为它要求两个贴图具有相同类型的值
有这样的功能吗?如果没有,最有效的方法是什么?这是我自己能做的最好的方法
import qualified Data.Map.Strict as M
mergeWith :: (Ord k) => (a -> b -> c) -> M.Map k a -> M.Map k b -> M.Map k c
mergeWith f m1 m2 = M.fromList $ g (M.toList m1) (M.toList m2)
where
g [] _ = []
g _ [] = []
g m1'@((k1, v1):_) m2'@((k2, v2):_)
| k1 < k2 = g (tail m1') m2'
| k1 > k2 = g m1' (tail m2')
| otherwise = (k1, f v1 v2) : g (tail m1') (tail m2')
导入符合条件的Data.Map.Strict作为M
合并::(Ord k)=>(a->b->c)->M.Map k a->M.Map k b->M.Map k c
合并f m1 m2=M.fromList$g(M.toList m1)(M.toList m2)
哪里
g[].[]
g[]=[]
g m1'@((k1,v1):u)m2'@((k2,v2):u1)
|k1k2=g m1'(尾部m2')
|否则=(k1,f v1 v2):g(尾m1’)(尾m2’)
它应该具有O(n)
复杂性,其中n
是更大地图的大小与相交是否不符合要求?它符合要求!我在文档中遗漏了它。谢谢:)