繁体   English   中英

为什么F#Set不能实现ISet <T> ?

[英]Why doesn't the F# Set implement ISet<T>?

.NET Framework在4.0版本中添加了一个ISet<T>接口。 在同一版本中,F#被添加为一流语言。 F#提供了一个不可变的Set<'T>类。

我认为提供的不可变集将实现ISet<T>接口,但事实并非如此。 有谁知道为什么?

我的猜测是他们不想实现一个可变的接口,但我认为这种解释并不成立。 毕竟,他们的Map<'Key, 'Value>类实现了IDictionary ,它是可变的。 并且在实现仅部分适当的接口的类的框架中的其他地方存在示例。

我的另一个想法是ISet<T>是新的,所以也许他们没有解决它。 但这似乎有点薄。

是否事实ISet<T>是通用(诉IDictionary ,这是不)有什么关系呢?

对此事的任何想法将不胜感激。

由于没有人跳进去,我会加上我的推测。 首先,大多数IDictionary<'k,'v>接口对于不可变字典仍然有意义; 它实际上只是添加或删除不起作用的单个元素。 其次,已经编写了大量依赖于IDictionary的代码,因此能够将F#值与该代码一起使用是一个不错的选择。

另一方面, ISet<'t>的几个方法需要变异,不仅包括添加单个元素,还包括几个变异操作符,例如union和intersection。 此外,许多设置用例已经被IEnumerable<'t>接口所包含 - 我认为人们依赖ISet<'t>实现来获取基于不可变集的代码是相对罕见的。

我不认为泛型与它有任何关系 - 请注意,尽管有MSDN文档,但F#maps实现了通用IDictionary接口,而不是非泛型接口。

我不认为之前知道过ISet (实际上我回顾过旧的电子邮件,并从2008年发现了一个提到它的BCL计划 - 但就是这样。所以我认为它不在我们的雷达上。)

也就是说,F#努力在其.NET 2.0和.NET 4.0位之间进行源代码兼容,以便将.NET 4.0实体反向移植到FSharp.Core.dll版本2.0中。 例如,2.0 FSharp.Core包含System.TupleSystem.BigIntegerSystem.Threading.CancelationTokenSource (异步编程模型的一部分)等,而ISet可能是后端口的另一项工作(目前还不清楚)对我来说,如果它是“必要的”移植它,但是)。

我会提出一个问题来看看,虽然这个时间点可能没什么问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM