Почему F # Set не реализует ISet <T>? - PullRequest
8 голосов
/ 01 апреля 2010

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

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

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

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

Имеет ли тот факт, что ISet<T> является родовым (v. IDictionary, который не имеет) какое-либо отношение к этому?

Любые мысли по этому вопросу будут оценены.

Ответы [ 2 ]

5 голосов
/ 02 апреля 2010

Вне руки Я не думаю, что Я ранее знал о 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 голосов
/ 02 апреля 2010

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

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

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

...