2013-03-23 30 views
10

Jaka jest dokładnie różnica między rozszerzeniem typu F # a rozszerzeniem typu i czy naprawdę potrzebujemy obu?F # - Rozszerzenie typu VS Rozszerzenie typu

Czy są sytuacje, w których jedna jest lepsza od drugiej i na odwrót?

Pytam, ponieważ niedawno miałem wykład w F #, gdzie wykładowca mówił o obu, a potem skomentował, że nie widział powodu, dla którego oba zostały włączone do języka F #.

Aktualizacja:

Ok, więc Vladislav Zorov linki do strony z przykładami zastosowania typu plastyka zarówno podczas definiowania własnych typów i rozszerzenie (lub rozszerzanie?) Typ zewnętrznego .

pad linki do strony MSDN gdzie nazywają go wewnętrzne i opcjonalne typ rozszerzenia.

Obie wydają się ilustrować to samo. Czy ktoś może podać konkretny przykład rozszerzenia typu i inny konkretny przykład powiększenia typu , być może, aby jednoznacznie wyjaśnić, czym dokładnie są te dwie rzeczy?

+0

Wygląda na to, że nas pomyliliśmy :) Łączę się z blogiem Tomasa Petricka, razem z Jonem Skeetem i Yin Zhu napisali to - http://manning.com/petricek/, który jest IMHO jednym z najlepszych , najbardziej szczegółowe książki na temat F #, jakie kiedykolwiek napisano. –

+0

whoops, masz rację, naprawiłem to. :-) – phaz

Odpowiedz

9

następujące bity z MSDN's Type Extensions page są stosowne (kopalni nacisk)

Istnieją dwa rodzaje rozszerzeń typu, które mają nieco inny składni i zachowanie. wewnętrzne rozszerzenie jest rozszerzeniem, które pojawia się w tym samym obszarze nazw lub module, w tym samym pliku źródłowym, i w tym samym zespole (DLL lub plik wykonywalny), jak typ rozszerzony o typ . Rozszerzenie opcjonalne jest rozszerzeniem, które pojawia się poza oryginalnym modułem, przestrzenią nazw lub zespołem typu rozszerzonego o numer: . Rozszerzenia wewnętrzne pojawiają się na typie, gdy typ jest zbadany przez odbicie, ale rozszerzenia opcjonalne nie. Opcjonalne rozszerzenia muszą znajdować się w modułach i mają zasięg tylko wtedy, gdy moduł zawierający rozszerzenie jest otwarty.

Celem opcjonalnego przedłużenia jest jasne. Pomaga wstrzykiwać nowe funkcje do typów nienależących do twoich zespołów. Na przykładach FSharpx używa go do tworzenia various helpers do parsowania prymitywne typy:

open System 

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

Dlaczego musisz wewnętrzną rozszerzenie wtedy? Odpowiedzią jest wygoda. Uważam, że przydatne jest podzielenie definicji typów na wiele sekcji z wyraźnymi celami.

W wielu bibliotekach F #, widziałem korzystanie z następującym wzorem: definicja typu -> funkcje użytkowe -> nieodłącznym przedłużenie. W ten sposób możesz zdefiniować zaawansowane funkcje narzędziowe na swoich typach, udostępniać je w modułach i nadal używać ich bezpośrednio w definicjach członków. Możesz spojrzeć na Complex type w F # PowerPack, aby zobaczyć wzór.

EDIT:

Szczerze mówiąc, często używam typ rozszerzenia i typ powiększania zamiennie. Najważniejsze jest to, czy są one wewnętrzne, czy opcjonalne.

4

Są to różne rzeczy. Augmentacje typu, gdy są zdefiniowane w tej samej przestrzeni nazw, module i pliku źródłowym, w rzeczywistości stają się częścią typu podczas kompilacji. Rozszerzenia typów (rozszerzenia typu a.k.a dla typów spoza modułu i pliku źródłowego) są implementowane za pomocą metod rozszerzania .NET.

Oba używają tej samej składni, jedyną różnicą jest to, czy wspomniany typ jest w tej samej przestrzeni nazw i złożeniu, tzn. Rozszerzasz swój kod, a dodatkowe metody można dodać do typu przed kompilacją.

Źródło: http://tomasp.net/blog/fsharp-iii-oop.aspx

Edit:

To terminologii mix-up, są one zarówno odnoszące się do tego samego - wewnętrzne rozszerzeniatypu rozszerzonych pierwszego rodzaju (tj. sama przestrzeń nazw i montaż), opcjonalne rozszerzenia są rozszerzeniem typu drugiego rodzaju (tj. montażem strony trzeciej, w poście na blogu jest to List<T> przykład augmentacji).

Zakładam, gdy wykładowca mówi o typu rozszerzonych, to odnosząc się do swoistych rozszerzeń, czyli rozszerzonych Pierwszy typ rodzaj, a kiedy mówi o rozszerzeń typów, on mówi o opcjonalnych rozszerzeń, lub drugi rozszerzonych typu rodzaj .