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>).

Я предполагаю, что когда ваш лектор говорит об увеличении типа, он ссылается на внутренние расширения, то есть на аудит первого типа, и когда он говорит о расширениях типов, он говорит о дополнительных расширениях или дополнениях второго рода.