Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Haskell中合并不同类型的地图?_Haskell - Fatal编程技术网

如何在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)

我正在寻找一个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) => (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
是更大地图的大小

相交是否不符合要求?

它符合要求!我在文档中遗漏了它。谢谢:)