Dlaczego F # Core definiuje ogólne typy tablic?

11

Właśnie zauważyłem, że przestrzeń nazw FSharp.Core zawiera ogólne typy tablic o maksymalnie 4 wymiarach, tj . Core. [] <'T> , Core. [,] <' T> itp. Wydaje się, że C # i VB mają się dobrze z System.Array - chociaż nie jest dla mnie jasne, jak radzą sobie z obsługą silnie typowanych specjalistycznych typów tablic, takich jak int [], string [].

Myślę, że to staje się dwa pytania:

  • W jaki sposób C # obsługuje silnie typowane wyspecjalizowane typy tablic, takie jak int [] w oparciu o nietypowy System.Array?
  • Biorąc pod uwagę, że C # udaje się to zrobić, dlaczego F # definiuje ogólne typy tablic?
Asik
źródło

Odpowiedzi:

8

F # nie definiuje ogólnych typów tablic per se. Tablice w języku F # są tego samego typu tablicowego, co pozostałe zastosowania .NET i pomimo wszystkich dowodów składniowych wskazujących na coś przeciwnego, nie są rodzajowe.

Czasami może to przynieść ci efekt odwrotny, gdy używasz odbicia w F # - nawet jeśli masz taki, array<int>który wydaje się być całkowicie poprawnym typem ogólnym, kiedy go sprawdzasz, otrzymujesz fałsz IsGenericType, prawda z IsArrayi otrzymujesz argument typu z GetElementTyperaczej wtedy GetGenericArguments.

Jak zauważył Telastyn w swojej odpowiedzi, jest to prawdopodobnie starszy bagaż .NET 1.0, z którym będziemy musieli żyć. Ale to tylko jedna z wielu rzeczy, które sprawiają, że używanie API refleksyjnego w F # jest prawdziwym polem minowym.

To, co F # definiuje, to [], [,] ...skróty typu / aliasy / operatory i moduły z odpowiednimi funkcjami, ale ostatecznie wszystkie odnoszą się do tego samego typu tablicy poniżej.

Możesz zajrzeć do kodu źródłowego na github tutaj i tutaj, aby zobaczyć go na własne oczy .

scrwtp
źródło
Ale są one wymienione jako typy rzeczywiste, a nie aliasy typów. Jestem zdezorientowany, ponieważ msdn.microsoft.com/en-us/library/dd233214.aspx mówi: „Typem wszystkich tablic F # jest macierz typu .NET Framework”, ale jaka jest relacja między System.Array a FSharp .Core ogólne tablice?
Asik
Nie ma żadnych ogólnych tablic;) Technicznie mogą to być typy rzeczywiste, i dlatego MSDN doc generator je podniósł, ale wszystko, co definiują, to sposób, w jaki kompilator powinien je rozwinąć, jeśli poprawnie go wczytam (pierwszy plik, który podłączyłem) oraz kilka metod rozszerzenia w drugim pliku. To wszystko. Utwórz jeden z nich i wywołaj na nim GetType. Będzie to specjalistyczny typ tablicy oparty na System.Array.
scrwtp
A raczej same typy statyczne są ogólne, ale nie są nimi zawijane typy tablic wykonawczych. Być może implementacja wnioskowania typu jest w ten sposób nieco łatwiejsza, ale jest to szalona przypuszczenie.
scrwtp
5

W jaki sposób C # obsługuje silnie typowane wyspecjalizowane typy tablic, takie jak int [] w oparciu o nietypowy System.Array?

Bardzo prawdopodobne, że generując wyspecjalizowaną klasę, która dziedziczy od System.Arrayczasu, gdy leki generyczne nie były dostępne w wersji 1.0. Zachowanie prawdopodobnie zostało zachowane w celu zachowania kompatybilności.

Biorąc pod uwagę, że C # udaje się to zrobić, dlaczego F # definiuje ogólne typy tablic?

Ponieważ F # nie miał takich samych ograniczeń kompatybilności jak C # 2.0 z istniejącym kodem. W oparciu o to, co wiem, C # 2.0 miałby ogólne typy tablic, gdyby było to pierwsze wydanie C #.

Telastyn
źródło