如何通过 F# 中的键将两个地图相交
How do I intersect two Maps by their keys in F#
我想将两个具有公共键的 F# 映射插入一个具有公共键和两个值的元组作为其值的映射中。
即签名类似于:
Map<K, T1> -> Map<K, T2> -> Map<K, T1 * T2>
有没有关于简单实用且高效的方法的想法?
我知道我可以将键组相交然后构建一个新地图,我只是想做一些感觉不那么脏的事情...
我过早地发布并删除了它,因为我不确定这是否只是与键相交...但我想取消删除它不会有什么坏处,因为它相当短:
let intersect otherMap =
Map.filter (fun k _ -> Map.containsKey k otherMap)
>> Map.map (fun k v1 -> v1, otherMap.[k])
编辑 没有中间地图,通过序列:
let intersect otherMap =
Map.toSeq >> Seq.choose (fun (k, v) ->
Map.tryFind k otherMap |> Option.map (fun v2 -> v, v2))
>> Map.ofSeq
一种方法是根据 Map.fold
:
来实现
module Map =
let intersect (m1:Map<'K, 'V1>) (m2:Map<'K, 'V2>) =
(Map.empty, m1) ||> Map.fold (fun acc k v1 ->
(acc, Map.tryFind k m2) ||> Option.fold (fun acc v2 ->
acc |> Map.add k (v1, v2)))
我之前也遇到过类似的问题,最后是这样解决的:
let intersect a b = Map (seq {
for KeyValue(k, va) in a do
match Map.tryFind k b with
| Some vb -> yield k, (va, vb)
| None -> () })
我想将两个具有公共键的 F# 映射插入一个具有公共键和两个值的元组作为其值的映射中。
即签名类似于:
Map<K, T1> -> Map<K, T2> -> Map<K, T1 * T2>
有没有关于简单实用且高效的方法的想法?
我知道我可以将键组相交然后构建一个新地图,我只是想做一些感觉不那么脏的事情...
我过早地发布并删除了它,因为我不确定这是否只是与键相交...但我想取消删除它不会有什么坏处,因为它相当短:
let intersect otherMap =
Map.filter (fun k _ -> Map.containsKey k otherMap)
>> Map.map (fun k v1 -> v1, otherMap.[k])
编辑 没有中间地图,通过序列:
let intersect otherMap =
Map.toSeq >> Seq.choose (fun (k, v) ->
Map.tryFind k otherMap |> Option.map (fun v2 -> v, v2))
>> Map.ofSeq
一种方法是根据 Map.fold
:
module Map =
let intersect (m1:Map<'K, 'V1>) (m2:Map<'K, 'V2>) =
(Map.empty, m1) ||> Map.fold (fun acc k v1 ->
(acc, Map.tryFind k m2) ||> Option.fold (fun acc v2 ->
acc |> Map.add k (v1, v2)))
我之前也遇到过类似的问题,最后是这样解决的:
let intersect a b = Map (seq {
for KeyValue(k, va) in a do
match Map.tryFind k b with
| Some vb -> yield k, (va, vb)
| None -> () })