簡體   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