Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 为什么';t F#Set实现ISet<;T>;?_.net_F#_Interface_Set - Fatal编程技术网

.net 为什么';t F#Set实现ISet<;T>;?

.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

NET Framework在4.0版本中添加了一个
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#包装,就像它现在存在的那样?