2013-03-23 6 views
10

В чем разница между расширением типа F # и расширением типа, и действительно ли нам нужны оба?F # - Расширение типа VS Расширение VS

Есть ситуации, когда один лучше другого, и наоборот?

Я спрашиваю, потому что недавно у меня была лекция в F #, где лектор говорил обо всех, и впоследствии прокомментировал, что он не видит причины, по которой оба были включены в язык F #.

Update:

Итак, Владислав Зоров ссылки на страницу с примерами использования типа увеличение как при определении собственных типов, а также расширение (или увеличивающий?) Внешний вид ,

подушечка ссылка на страницу MSDN, где они называют его внутренним и опциональным расширениетипа.

Оба, кажется, иллюстрируют одно и то же. Может ли кто-нибудь прийти с конкретным примером расширением типа и еще одним конкретным примером увеличения типа, возможно, чтобы явным образом разъяснить, что это за две вещи?

+0

Вы, кажется, нас перепутали :) Я связываюсь с блогом Томаша Петричека, вместе с Джоном Скитом и Инь Чжу они написали это - http://manning.com/petricek/, что является ИМХО одним из величайших , наиболее подробные книги по F #, когда-либо написанные. –

+0

кричит, ты прав, я исправил это. :-) – phaz

ответ

9

следующие биты из MSDN's Type Extensions page актуальны (курсив мой):

Есть две формы расширений типа, которые имеют несколько иной синтаксис и поведение. Внутреннее расширение является расширением, которое появляется в том же пространстве имен или модуле в том же исходном файле и в той же сборке (DLL или исполняемый файл), поскольку тип расширен. Дополнительное расширение - это расширение, которое появляется за пределами оригинального модуля, пространства имен или сборки типа . Внутренние расширения появляются в типе, когда тип проверен отражением, но необязательных расширений нет. Необязательные расширения должны быть в модулях, и они доступны только в том случае, если модуль , содержащий расширение, открыт.

Цель дополнительного расширения ясна. Это помогает вам вводить новые функции в типы, не принадлежащие вашим сборкам. Для примера, FSharpx использует его для создания various helpers для разбора примитивных типов:

open System 

type Boolean with 
    static member parse x = 
     match bool.TryParse(x) with 
     | true,v -> Some v 
     | _ -> None 

Зачем вам внутреннее расширение, то? Ответ - это его удобство. Я считаю полезным разбить определения типов на несколько разделов с ясными целями.

Во многих библиотеках F # я видел использование следующего шаблона: определение типа -> служебные функции -> внутреннее расширение. Таким образом, вы можете определить сложные функции утилиты на своих типах, сделать их доступными в модулях и по-прежнему использовать их непосредственно в определениях членов. Вы можете посмотреть Complex type в F # PowerPack, чтобы увидеть шаблон.

EDIT:

Честно говоря, я часто использую расширение типа и тип функционального дополнения взаимозаменяемые. Дело в том, являются ли они внутренними или необязательными.

4

Это разные вещи. Типичные дополнения, когда они определены в одном пространстве имен, модуле и исходном файле, фактически становятся частью типа при компиляции. Расширения типа (расширения типа a.k.a. для типов вне модуля и исходного файла) реализуются с помощью методов расширения .NET.

Они оба используют один и тот же синтаксис, единственное различие заключается в том, относится ли указанный вами тип к тому же пространству имен и сборки, т. Е. Вы увеличиваете свой собственный код, а дополнительные методы могут быть добавлены к вашему типу перед компиляцией.

Источник: http://tomasp.net/blog/fsharp-iii-oop.aspx

Edit:

Это терминологической перепутать, они обе относятся к одной и той же вещи - внутренние расширения являются аугментаций типа первого рода (т.е. такое же пространство имен и сборка), Дополнительные расширения: Тип дополнения второго рода (т. е. сторонняя сборка, в блоге это List<T> пример дополнений).

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

Смежные вопросы