2013-02-26 11 views
23

Biorąc pod uwagę, że implementacja generycznych CLR obsługuje więcej funkcji niż maszyny JVM, takie jak reifikacja, a generyczne maszyny JVM to tylko Java "compiler trick", dlaczego typy wyższego typu nie są możliwe w języku F #, ale są możliwe w Scali? Czy implementacja generycznych CLR w jakiś sposób staje na drodze do rzeczy, podczas gdy brak maszyny JVM pozwala ci pójść dalej, niż zamierzali projektanci; podobnie jak języki dynamiczne pozwalają robić sztuczki, które uniemożliwiłyby mocno napisany kompilator?Rodzaje wyższych typów - dlaczego możliwe Scala, ale nie F #?

+10

Dlaczego to się zamknęło? Naprawdę nie rozumiem tego wyjaśnienia. Dostarczam fakty, zadaję pytanie, które ma merytoryczną odpowiedź. Ktoś zdawał się zaskoczyć na słowo "lepsze", jak pierwotnie zadeklarowano to pytanie, i stworzył odpowiedź argumentacyjną, ale nie o to chodziło. Czy ludzie szukają słów kluczowych typu "lepiej" i głosują, aby zamknąć a priori? – lobsterism

Odpowiedz

20

Zasadniczo nie jestem pewien, czy istnieje coś, co powstrzymuje F # przed dodaniem wyższych typów; CLR nie wspiera ich natywnie, więc potrzebna byłaby bardziej pośrednia strategia kompilacji, ale tak też jest w przypadku Scala w JVM. To może, ale nie musi, być bardziej skomplikowane, aby zrobić to na rekrystowanych generycznych CLR, ale podejrzewam, że powód, dla którego F # nie zawiera ich, jest bardziej filozoficzny. Chociaż typy o wyższym typie byłyby przyjemne, projekt F # zwykle faworyzuje proste funkcje, które dobrze współdziałają z innymi językami .NET; typy wyższego rodzaju prawdopodobnie wymagałyby znacznego wysiłku w celu dodania do języka, skomplikowałyby wnioskowanie typu i inne części języka i na pewno nie współdziałałyby dobrze z C# i innymi językami .NET, więc koszty (w tym koszty alternatywne) były prawdopodobnie postrzegane jako przewyższają korzyści.

+0

Czy typy o wyższych typach zdefiniowane w Scali nie współdziałają z Javą? – lobsterism

+1

@Lobsterism - Nie jestem ekspertem od Scala, ale ponieważ system typu Java nie obsługuje ich, nie jestem pewien, jak mogli. – kvb

-4

Lepiej? Niewątpliwie.

Jedyną różnicą, o której wiem, jest funkcja generycznych nazwana "specjalizacja". Jest dostępny pod kontrolą programistów w Scali. Więc ... Muszę powiedzieć, że można udowodnić, że Scala jest "lepsza".

+0

Scala * jest * lepsza, to właśnie mówię, ale zastanawiam się, dlaczego nie jest to możliwe w F #, gdy CLR ma mocniejszy system typów w porównaniu z JVM. – lobsterism

+0

@Lobsterism Java i JVM to nie to samo ... W ten sposób scala może mieć "silniejszy" system pisania w porównaniu do java, ale obie używają tej samej maszyny JVM! – korefn

+1

W rzeczywistości "specjalizacja" Scali ujawnia krótkie przyjście JVM: typy prymitywne są poza hierarchią obiektów, a typy ogólne nie są reifikowane. Z drugiej strony, .NET i F # mają 'ValueTypes', które są częścią hierarchii obiektów, mając jednocześnie wszystkie zalety wydajności prymitywów JVM. Co oznacza typ 'List ' w .NET (gdzie 'Int32' jest .NET ValueType ') jest w pełni reifikowany i nie wymaga boksowania/rozpakowywania w celu uzyskania dostępu do elementów. –

Powiązane problemy