让我们凭经验测试一下,找出......
这个例子:
[("key", 1); ("key", 2); ("key", 3)] |> Map.ofSeq
Run Code Online (Sandbox Code Playgroud)
产生以下结果:
map [("key", 3)]
Run Code Online (Sandbox Code Playgroud)
这个例子:
[("key", 3); ("key", 1);] |> Map.ofSeq
Run Code Online (Sandbox Code Playgroud)
给出这个结果:
map [("key", 1)]
Run Code Online (Sandbox Code Playgroud)
因此,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)
Run Code Online (Sandbox Code Playgroud)
这允许您传递一个名为的函数resolver,该函数从给定键的重复值列表中选择值.当我们使用上面的第一个例子时,我们可以明确地选择最小值,如下所示:
[("key", 1); ("key", 2); ("key", 3)]
|> Map.ofSeqWithDuplicates (fun key values -> values |> Seq.min)
Run Code Online (Sandbox Code Playgroud)
所以现在我们得到地图:
map [("key", 1)]
Run Code Online (Sandbox Code Playgroud)