2013-02-26 9 views
23

Dato che l'implementazione dei generici CLR supporta più funzionalità rispetto alle JVM, come la reificazione, e i generici della JVM sono un semplice Java "compiler trick", perché non sono possibili tipi di tipo superiore in F # ma possibile in Scala? L'implementazione dei generici CLR in qualche modo intralcia le cose, mentre la mancanza di una delle JVM ti consente di andare oltre ciò che i progettisti intendevano; un po 'come i linguaggi dinamici ti permettono di fare trucchi che un compilatore fortemente tipizzato renderebbe impossibile?Tipi più alti: perché possibile Scala ma non F #?

+10

Perché è stato chiuso? Io davvero non capisco la spiegazione data. Sto fornendo fatti, facendo una domanda che ha una risposta fattuale. Qualcuno sembrava attaccarsi alla parola "meglio" come la domanda originariamente era stata formulata, e ha creato una risposta argomentativa, ma non era di questo che si trattava. Le persone cercano solo parole chiave come "migliori" e votano per chiudere a priori? – lobsterism

risposta

20

In linea di principio, non sono sicuro che ci sia qualcosa che impedisca a F # di includere tipi più elevati; il CLR non li supporta in modo nativo, quindi è necessario utilizzare una strategia di compilazione più indiretta, ma questo è il caso anche per Scala sulla JVM. Potrebbe essere o non essere più complicato farlo sopra i generici reificati del CLR, ma sospetto che la ragione per cui F # non li includa è più filosofica. Mentre i tipi più elevati dovrebbero essere belli, il design di F # tende a favorire semplici funzionalità che interagiscono bene con altri linguaggi .NET; i tipi più elevati probabilmente richiederebbero uno sforzo significativo per aggiungere alla lingua, complicherebbero l'inferenza di tipo e altre parti della lingua e sicuramente non interferirebbero bene con C# e altri linguaggi .NET, quindi i costi (inclusi i costi di opportunità) erano probabilmente percepiti come superano i benefici.

+0

I tipi di tipo superiore definiti in Scala non interagiscono con Java? – lobsterism

+1

@lobsterism - Non sono un esperto di Scala, ma dal momento che il sistema di tipi Java non li supporta, non sono sicuro di come potrebbero. – kvb

-4

Meglio? In teoria.

L'unica differenza di cui sono a conoscenza è una funzione dei farmaci generici chiamata "specializzazione". Ed è disponibile sotto il controllo del programmatore in Scala. Quindi ... dovrei dire che si può affermare che Scala è "migliore".

+0

Scala * è * meglio, questo è quello che sto dicendo, ma mi chiedo perché non è possibile farlo in F # quando il CLR ha il sistema di tipi più potente rispetto a JVM. – lobsterism

+0

@lobsterism Java e JVM non sono la stessa cosa ... È così che scala può avere un sistema di scrittura "più forte" rispetto a java ma entrambi usano la stessa JVM! – korefn

+1

In effetti, la "specializzazione" di Scala espone una breve venuta della JVM: i tipi primitivi sono al di fuori della gerarchia degli oggetti e i tipi generici non sono reificati. D'altra parte, .NET e F # hanno 'ValueTypes' che fanno parte della gerarchia degli oggetti mentre hanno tutti i vantaggi delle prestazioni dei tipi primitivi della JVM. Il che significa che un tipo come "Lista " in .NET (dove 'Int32' è un .NET' ValueType') è completamente reificato e non richiede boxing/unboxing per accedere agli elementi. –