F # - Расширение типа VS Расширение типа
В чем же разница между расширением типа F # и расширением типа, и действительно ли нам нужны оба?
Существуют ли ситуации, когда один лучше другого, и наоборот?
Я спрашиваю, потому что недавно у меня была лекция в F #, где лектор говорил обо всех, и впоследствии прокомментировал, что он не мог понять, почему оба были включены в язык F #.
Update:
Хорошо, поэтому Vladislav Zorov ссылается на страницу с примерами использования расширения типа как при определении ваших собственных типов, так и при расширении (или дополнении?) внешнего типа.
pad на странице MSDN, где они называют это внутренним и необязательным расширением типа.
Оба, кажется, иллюстрируют одно и то же. Может ли кто-нибудь прийти с конкретным примером расширения типа и еще одним конкретным примером расширения типа, чтобы явно разъяснить, что это за две вещи?
Ответы
Ответ 1
Следующие биты из Расширения страниц MSDN страницы являются релевантными (выделение мое):
Существуют две формы расширений типов, которые немного отличаются синтаксис и поведение. Внутреннее расширение - это расширение, которое появляется в том же пространстве имен или модуле, в том же исходном файле и в той же сборке (DLL или исполняемый файл), поскольку тип продлен. Дополнительное расширение - это расширение, которое появляется за пределами исходный модуль, пространство имен или сборка типа, являющегося продлен. Внутренние расширения появляются в типе, когда тип анализируются путем отражения, но необязательные расширения этого не делают. Необязательный расширения должны быть в модулях, и они доступны только в том случае, если модуль, содержащий расширение, открыт.
Цель дополнительного расширения понятна. Это помогает вам вводить новые функции в типы, не принадлежащие вашим сборкам. Например, FSharpx использует его для создания различных помощников для синтаксического анализа примитивных типов:
open System
type Boolean with
static member parse x =
match bool.TryParse(x) with
| true,v -> Some v
| _ -> None
Почему вам нужно внутреннее расширение? Ответ - это его удобство. Я считаю полезным разбить определения типов на несколько разделов с ясными целями.
Во многих библиотеках F # я видел использование следующего шаблона: определение типа → служебные функции → внутреннее расширение. Таким образом, вы можете определить сложные функции утилиты на своих типах, сделать их доступными в модулях и по-прежнему использовать их непосредственно в определениях членов. Вы можете посмотреть сложный тип в F # PowerPack, чтобы увидеть шаблон.
EDIT:
Честно говоря, я часто использую расширение типа и добавление типа взаимозаменяемо. Дело в том, являются ли они внутренними или необязательными.
Ответ 2
Это разные вещи. Типичные дополнения, когда они определены в одном пространстве имен, модуле и исходном файле, фактически становятся частью типа при компиляции. Расширения типа (расширения типа a.k.a. для типов вне модуля и исходного файла) реализуются с помощью методов расширения .NET.
Оба они используют один и тот же синтаксис, единственное различие заключается в том, относится ли тот тип, который вы упоминаете, в том же пространстве имен и сборе, то есть вы увеличиваете свой собственный код, а дополнительные методы могут быть добавлены к вашему типу перед компиляцией.
Источник: http://tomasp.net/blog/fsharp-iii-oop.aspx
Edit:
Это сочетание терминологии, они оба относятся к одному и тому же - внутренние расширения - это расширения типа первого рода (то есть такое же пространство имен и сборка), дополнительные расширения - это дополнения типа второго рода (т.е. сторонние сборка, в блоге это пример расширения List<T>
).
Я предполагаю, что когда ваш лектор говорит об увеличении типа, он ссылается на внутренние расширения, то есть на аудит первого типа, и когда он говорит о расширениях типов, он говорит о дополнительных расширениях или дополнениях второго рода.