如何在 F# 中通过键与两个地图相交



我想将两个具有公共键的 F# 映射插入到一个具有公共键和两个值的元组作为其值的映射中。

即签名是这样的:

Map<K, T1> -> Map<K, T2> -> Map<K, T1 * T2>

对一个简单的功能和性能方法有什么想法吗?

我知道我可以交叉几组钥匙,然后构建一张新地图,我只想做一些感觉不那么脏的事情......

我之前也有类似的问题,最后是这样解决的:

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    -> () })

一种方法是在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 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

相关内容

  • 没有找到相关文章

最新更新