gpt4 book ai didi

dictionary - 为什么 F# map 使用可变操作实现接口(interface)?

转载 作者:行者123 更新时间:2023-12-04 05:14:04 26 4
gpt4 key购买 nike

当我意识到 F# 的 map 时,我有些惊讶。实现 IDictionary<'Key, 'Value> 和 ICollection<KeyValuePair<'a, 'b>>考虑到两者都支持突变(添加和删除)作为契约(Contract)的一部分。

查看 map 的执行情况它只是在您尝试引起突变时除外!

let map = [| (1, "one"); (2, "two") |] |> Map.ofArray
let dict = map :> IDictionary<int, string>
dict.Add(3, "three");;

上面的代码抛出异常:

System.NotSupportedException: Map values cannot be mutated. at Microsoft.FSharp.Collections.FSharpMap2.System-Collections-Generic-IDictionary2-Add(TKey k, TValue v) at .$FSI_0007.main@() Stopped due to error



这是预期的。

一个不可变集合能够将自己暴露为一个可变集合,只是当该集合的消费者试图引起突变时它抛出异常似乎是一个危险的决定。

我在这里错过了什么吗?

最佳答案

我认为主要原因是.NET 没有任何表示不可变(a 接口(interface)的一部分)字典的接口(interface)。这意味着所有 .NET API 都必须采用 IDictionary<K, V>作为参数,即使他们只打算从字典中读取。所以:

  • 实现 IDictionary<'K, 'V>几乎是使 F# 不可变映射可用作任何需要支持查找的对象的 .NET 库的参数的唯一方法。遗憾的是,.NET 中没有只读选项。
  • 实现 ICollection<KeyValuePair<'K, 'V>>对我来说没有太大意义,因为有一个只读替代 IEnumerable<KeyValuePair<'K, 'V>>并且不可变映射也实现了这个接口(interface)。

    但也许有一些 .NET 库需要 ICollection<'T> (为了提高效率 - 即获取 Count 而不枚举所有元素)并以只读方式使用它。

    编辑:正如丹尼尔在评论中指出的那样,实现 ICollection是必需的,因为 IDictionary接口(interface)继承自它。

  • 我认为缺少只读接口(interface)是很不幸的,但可能无法解决这个问题,因为这意味着更改现有的 .NET 集合库。

    关于dictionary - 为什么 F# map 使用可变操作实现接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11120205/

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