Почему F# не Устанавливает реализацию ISet <T>?

Платформа.NET добавляет ISet<T> интерфейс с этими 4,0 выпусками. В том же выпуске F# добавляется как первоклассный язык. F# обеспечивает неизменное Set<'T> класс.

Казалось бы логичным мне, что неизменный обеспеченный набор реализует ISet<T> интерфейс, но это не делает. Кто-либо знает почему?

Мое предположение - то, что они не хотели реализовывать интерфейс, предназначенный, чтобы быть изменяемыми, но я не думаю, что это объяснение держит. В конце концов, их Map<'Key, 'Value> реализации класса IDictionary, который изменяем. И существуют примеры в другом месте в рамках интерфейсов реализации классов, которые являются только частично соответствующими.

Моя другая мысль - это ISet<T> является новым, поэтому возможно, они не нашли время для него. Но это кажется довольно тонким.

Делает факт это ISet<T> универсально (против. IDictionary, который не является), имеют какое-либо отношение к нему?

Любые мысли о вопросе ценились бы.

8
задан Sean Devlin 1 April 2010 в 19:16
поделиться

2 ответа

Навскидку, я не думаю, что Я ранее знал о 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 потенциально может стать еще одной частью работы по бэк-портированию (хотя мне неясно, будет ли это «необходимым» портировать).

Я запрошу проблему, чтобы взглянуть на нее, хотя на данный момент это может быть спорным.

5
ответ дан 5 December 2019 в 17:35
поделиться

Поскольку никто больше не вмешивается, я добавлю свои предположения. Во-первых, большая часть интерфейса IDictionary <'k,' v> по-прежнему имеет смысл для неизменяемого словаря; это действительно только добавление или удаление отдельных элементов, которые не работают. Во-вторых, уже написано приличное количество кода, основанного на IDictionary , поэтому возможность использовать значения F # с этим кодом является хорошим плюсом.

С другой стороны, некоторые из методов ISet <'t> требуют изменения, включая не только добавление отдельных элементов, но также несколько операторов изменения набора, таких как объединение и пересечение. Кроме того, многие установленные варианты использования уже включены в интерфейс IEnumerable <'t> - я думаю, что люди будут относительно редко полагаться на реализации ISet <' t> для неизменяемый код на основе набора.

Я не думаю, что универсальность имеет какое-либо отношение к этому - обратите внимание, что, несмотря на документацию MSDN, карты F # реализуют общий интерфейс IDictionary , а не неуниверсальный.

5
ответ дан 5 December 2019 в 17:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: