Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.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
Collections 在F#中,如何合并2个集合.Map实例?_Collections_F# - Fatal编程技术网

Collections 在F#中,如何合并2个集合.Map实例?

Collections 在F#中,如何合并2个集合.Map实例?,collections,f#,Collections,F#,我正在尝试合并两个贴图,但没有用于连接集合的内置方法。那么您是如何做到这一点的呢?您可以使用Map.fold和Map.add实现这一点,因为add实际上是add/replace: let map1 = Map.ofList [ 1, "one"; 2, "two"; 3, "three" ] let map2 = Map.ofList [ 2, "two"; 3, "oranges"; 4, "four" ] let newMap = Map.fold (fun acc key value

我正在尝试合并两个贴图,但没有用于连接集合的内置方法。那么您是如何做到这一点的呢?

您可以使用Map.fold和Map.add实现这一点,因为add实际上是add/replace:

let map1 = Map.ofList [ 1, "one"; 2, "two"; 3, "three" ]
let map2 = Map.ofList [ 2, "two"; 3, "oranges"; 4, "four" ]


let newMap = Map.fold (fun acc key value -> Map.add key value acc) map1 map2

printfn "%A" newMap 

没有开箱即用地提供合并的原因可能是您需要处理密钥冲突。在这个简单的合并算法中,我们简单地从第二个映射中获取键值对,这可能不是您想要的行为。

定义以下函数:

let join (p:Map<'a,'b>) (q:Map<'a,'b>) = 
    Map(Seq.concat [ (Map.toSeq p) ; (Map.toSeq q) ])
结果是:

val c : Map<int,int> =
  map [(1, 11); (2, 21); (3, 32); (4, 41); (5, 51); (6, 61)]
val c:Map=
地图[(1,11);(2,21);(3,32);(4,41);(5,51);(6,61)]

另一种方法是:

let merge (a : Map<'a, 'b>) (b : Map<'a, 'b>) (f : 'a -> 'b * 'b -> 'b) =
    Map.fold (fun s k v ->
        match Map.tryFind k s with
        | Some v' -> Map.add k (f k (v, v')) s
        | None -> Map.add k v s) a b
让合并(a:Map)(b:Map)(f:'a->'b*'b->'b)=
Map.fold(趣味s k v->
将Map.tryFind k s与匹配
|一些v'->Map.addk(fk(v,v'))s
|无->映射。添加k v s)a b
如果存在重复的关键点,它可以让您决定需要什么值

例如:

let a = Map([1,11;2,21;3,31;])

let b = Map([3,32; 4,41;5,51;6,61;])

merge a b (fun k (v, v') -> v + v');;

//Result
val it : Map<int,int> =
  map [(1, 11); (2, 21); (3, 63); (4, 41); (5, 51); (6, 61)]
a=Map([1,11;2,21;3,31;]))
设b=Map([3,32;4,41;5,51;6,61;]))
合并a b(funk k(v,v')->v+v');;
//结果
ValIT:地图=
地图[(1,11);(2,21);(3,63);(4,41);(5,51);(6,61)]

注意,键
3
是不同的。

您应该看看这里(),基本上是map1。Union(map2)应该工作起来很简单:使用linq的Union操作符,您将得到一个IEnumerable的元组,与映射不完全相同。事实上,我就是这样实现的:注意:您实际上不需要在输入参数上指定类型。请注意,这会从头开始重建两个映射,这可能非常缓慢。如果
map1
较大而
map2
较小,则更好的解决方案是Robert的方法。
let a = Map([1,11;2,21;3,31;])

let b = Map([3,32; 4,41;5,51;6,61;])

merge a b (fun k (v, v') -> v + v');;

//Result
val it : Map<int,int> =
  map [(1, 11); (2, 21); (3, 63); (4, 41); (5, 51); (6, 61)]