gpt4 book ai didi

f# - 具有重复键的 Map.ofSeq 的行为是什么?

转载 作者:行者123 更新时间:2023-12-04 16:38:15 25 4
gpt4 key购买 nike

当同一个键出现两次时 Map.ofSeq 的行为是什么?

docs 没有提到这种情况。

最佳答案

让我们凭经验对其进行测试并找出...

这个例子:

[("key", 1); ("key", 2); ("key", 3)] |> Map.ofSeq

产生以下结果:
map [("key", 3)]

而这个例子:
[("key", 3); ("key", 1);] |> Map.ofSeq

给出了这个结果:
map [("key", 1)]

因此,当存在重复项时, Map.ofSeq 似乎使用给定键的序列中的最后一个条目。

编辑

正如 Fyodor Soikin 指出的那样,您不会希望依赖代码中未记录的行为。因此,如果要确保在序列中有多个具有相同键的值时选择给定值的特定行为,可以使用如下函数:
module Map =
let ofSeqWithDuplicates<'key,'value when 'key : comparison> (resolver: 'key -> 'value seq -> 'value) seq =
let rec getDuplicates state remaining =
match remaining |> Seq.tryHead with
| Some (key, value) ->
let newItem = Seq.singleton value
let newState =
match state |> Map.tryFind key with
| Some existing -> state |> Map.add key (existing |> Seq.append newItem)
| None -> state |> Map.add key newItem
remaining |> Seq.tail |> getDuplicates newState
| None -> state

seq
|> getDuplicates Map.empty<'key, 'value seq>
|> Map.map (fun key values -> values |> resolver key)

这允许您传递一个名为 resolver 的函数,该函数从给定键的重复值列表中选择值。在上面的第一个示例中使用它时,我们可以像这样明确选择最小值:
[("key", 1); ("key", 2); ("key", 3)] 
|> Map.ofSeqWithDuplicates (fun key values -> values |> Seq.min)

所以现在我们得到了 map :
map [("key", 1)]

关于f# - 具有重复键的 Map.ofSeq 的行为是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50804004/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com