.net 为什么';t F#Set实现ISet<;T>;?
NET Framework在4.0版本中添加了一个.net 为什么';t F#Set实现ISet<;T>;?,.net,f#,interface,set,.net,F#,Interface,Set,NET Framework在4.0版本中添加了一个ISet接口。在同一版本中,F#被添加为一流语言。F#提供了一个不可变的集合,因为没有其他人参与,我将添加我的推测。首先,对于一个不变的字典来说,IDictionary接口的大部分仍然是有意义的;实际上,它只是添加或删除单个不起作用的元素。其次,已经编写了大量依赖于IDictionary的代码,因此能够在代码中使用F值是一个不错的选择 另一方面,一些基于集合的不可变代码的ISet实现 我不认为泛型与此有任何关系-请注意,尽管有MSDN文档,F#m
ISet
接口。在同一版本中,F#被添加为一流语言。F#提供了一个不可变的集合,因为没有其他人参与,我将添加我的推测。首先,对于一个不变的字典来说,IDictionary
接口的大部分仍然是有意义的;实际上,它只是添加或删除单个不起作用的元素。其次,已经编写了大量依赖于IDictionary
的代码,因此能够在代码中使用F值是一个不错的选择
另一方面,一些基于集合的不可变代码的ISet实现
我不认为泛型与此有任何关系-请注意,尽管有MSDN文档,F#maps实现了泛型IDictionary
接口,而不是非泛型接口。我不认为我以前知道ISet
。(事实上,我翻阅了旧的电子邮件,发现其中提到了BCL的计划——从2008年开始——但就是这样。所以我认为这不在我们的雷达上。)
这就是说,F#努力在其.NET 2.0和.NET 4.0位之间实现源代码兼容,甚至将.NET 4.0实体向后移植到FSharp.Core.dll 2.0版。例如,2.0 FSharp.Core包含System.Tuple
,System.BigInteger
,System.Threading.CancelationTokenSource
(异步编程模型的一部分)等,而ISet
可能是后端口的另一项工作(但我不清楚是否“有必要”对其进行移植)
我将提交一个问题来看看,尽管目前可能还没有定论。在.NET framework本身中,ReadOnlyCollection
实现了ICollection
,这是一个可变接口。@Steven对,这是一个框架类实现了一个不完全合适的接口的示例。这听起来似乎有道理。尽管如此,如果这是真的,还是令人沮丧。对我来说,包含所有那些暗示实现类可变性的接口方法似乎是一个错误。(类似地,我认为包含意味着类应该是不可变的方法是错误的。)如果ISet
只包含“read”成员就好了。我认为目前的界面过于固执己见,现在我仍然没有办法简单地传达“这是一个独特项目的集合”(至少就F#interop而言)看起来并不是大多数:据我统计,ISet
的11个适当成员中只有5个需要变异。如果包含从ICollection
继承的成员,则它将成为18个成员中的8个。(其中,至少void Add(T item)
可能会被显式实现。)我正在考虑写一个类似的答案,但后来我查看了ISet
接口,发现它有很多操作仍然可以实现(即SetEquals
,IsSubsetOf
,issubertof
,重叠
,ispropertsubsetof
,ispropertsupersetof
),也许它比IDictionary
要少,但还是有很多…另一个原因可能是没有.NET方法会采用ISet
,因此实现它没有应用程序驱动的理由(我想IDictionary
可能有一些很好的用例)@Tomas这是真的,但在我看来,不实现它会给编写新代码的人带来一些摩擦。例如,我想定义一些传递集合的接口(不是修改,只是查询)。这给我的代码的F#消费者增加了摩擦,因此现在我的界面回到IEnumerable
几乎更有意义。有点不高兴,我对将此界面添加到框架中感到非常兴奋。这似乎会稍微抑制采用。@Sean:我同意,我想.NET BCL应该真的加入包括一组更好的接口来表示集合、集合、字典及其不可变版本等。考虑到我们不得不面对的.NET 1遗留问题,这可能很难做到。这是有道理的。我没有意识到有一种驱动力来保持F#source在各个框架之间的兼容性。只是好奇,但这背后的原因是什么?是吗官方的立场是.NET4.0不包含F#的“新”版本,而是一个官方的、一流的F#包装,就像它现在存在的那样?