![](/img/trans.png)
[英]System.Version doesn't implement System.IComparable in F#
[英]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.Tuple
, System.BigInteger
, System.Threading.CancelationTokenSource
(異步編程模型的一部分)等,而ISet
可能是后端口的另一項工作(目前還不清楚)對我來說,如果它是“必要的”移植它,但是)。
我會提出一個問題來看看,雖然這個時間點可能沒什么問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.