增强F#中Map的最佳方法是什么,以便在引发KeyNotFoundException时报告密钥?

增强F#中Map的最佳方法是什么,以便在引发KeyNotFoundException时报告密钥?,f#,F#,我发现F#Maps不报告KeyNotFoundExceptions中的键是不切实际的: let m = Map.empty<int,string> m.[2] >> KeyNotFoundException: The given key was not present in the dictionary. // ok, and which key? 设m=Map.empty m、 [2] >>KeyNotFoundException:字典中不存在给定的密钥。//好的,

我发现F#Maps不报告KeyNotFoundExceptions中的键是不切实际的:

let m = Map.empty<int,string>
m.[2]

>> KeyNotFoundException: The given key was not present in the dictionary. // ok, and which key?
设m=Map.empty
m、 [2]
>>KeyNotFoundException:字典中不存在给定的密钥。//好的,哪把钥匙?
在本例中,当密钥存在时,问题当然不会出现,但当运行的程序出现异常时,问题就会出现。我试图扩展项,但扩展未覆盖()

模块扩展=

键入Map我认为没有任何切实可行的方法可以做到这一点,我怀疑包装
Map
会带来更多麻烦。相反,我会考虑自定义操作符:

let (@) map key =
    match map |> Map.tryFind key with
        | Some value -> value
        | None -> failwithf "key not found in map: %A" key

let m = Map.empty<int,string>
m @ 2
let(@)映射键=
将map |>map.tryFind键与
|一些价值->价值
|无->未在映射中找到F“键:%A”键
设m=Map.empty
m@2

我想在不更改代码库的情况下更改代码库中的所有调用。我意识到,这是如此频繁,只是知道它是直接的关键会有很大帮助。包装比添加一个操作符要少。在这一点上,大多数人同意@brianberns。在查找可能不存在的项目时,应使用
Map.tryFind
或使用运算符对其进行扩充。您还应该正确处理None情况,而不是抛出异常<代码>映射。[key]
应用于确定密钥存在且异常应表示不可恢复的错误的情况。重构所有现有的用途可能是一件痛苦的事情,但一旦重构完成,你就不必再担心它了。
let (@) map key =
    match map |> Map.tryFind key with
        | Some value -> value
        | None -> failwithf "key not found in map: %A" key

let m = Map.empty<int,string>
m @ 2