Domanda

Ho letto che il sistema di tipi di Scala è indebolita da interoperabilità Java e quindi non in grado di eseguire alcuni degli stessi poteri di sistema di tipo di Haskell. È vero? È la debolezza a causa della cancellazione del tipo, o mi sbaglio in ogni modo? È questa differenza la ragione che Scala non ha typeclasses?

È stato utile?

Soluzione

La grande differenza è che alla Scala non ha Hindley-Milner tipo globale inferenza e utilizza invece una forma di inferenza di tipo locale, che richiede di specificare i tipi di parametri del metodo e il tipo di ritorno per le funzioni di overload o ricorsive.

Questo non è guidato da cancellazione del tipo o da altri requisiti della JVM. Tutte le possibili difficoltà qui possono essere superati, e sono stati, basta considerare Jaskell - http: //docs.codehaus .org / display / JASKELL / Casa

H-M inferenza non funziona in un contesto orientato agli oggetti. In particolare, quando si utilizza il tipo-polimorfismo (in contrasto con il polimorfismo ad hoc di classi di tipo). Questo è fondamentale per una forte interoperabilità con le altre librerie Java, e (in misura minore) per ottenere la migliore ottimizzazione possibile dalla JVM.

Non è davvero valida a condizione che sia Haskell o Scala ha un sistema di tipo più forte, solo che sono diversi. Entrambe le lingue stanno spingendo i confini per la programmazione tipo basata in direzioni diverse, e ogni lingua ha punti di forza unici che sono difficili da duplicare in altro.

Altri suggerimenti

sistema di tipi di Scala è diverso da Haskell di, anche se i concetti di Scala a volte sono ispirati direttamente dal punti di forza di Haskell e la sua comunità consapevole di ricercatori e professionisti.

Naturalmente, in esecuzione su una macchina virtuale non destinati in primo luogo per la programmazione funzionale in primo luogo crea alcuni problemi di compatibilità con le lingue esistenti rivolti questa piattaforma. Poiché la maggior parte del ragionamento sui tipi accade al momento della compilazione, i limiti di Java (come lingua e come una piattaforma) in fase di runtime non sono niente di essere preoccupato per (tranne la cancellazione di tipo, anche se esattamente questo bug sembra rendere l'integrazione nel Java degli ecosistemi più senza soluzione di continuità).

Per quanto ne so l'unico "compromesso" a livello di sistema di tipo con Java è una sintassi speciale per gestire tipi di Raw. Mentre Scala non ha nemmeno permettere più tipi di prime, accetta file di classe anziani Java con quel bug. Codice Forse avete visto come List[_] (o più a lungo List[T] forSome { type T } equivalente). Questa è una caratteristica compatibilità con Java, ma è considerato come un tipo esistenziale internamente troppo e non indebolisce il sistema tipo.

Il sistema di tipi di Scala fa supporto classi di tipo , anche se in un più prolisso modo di Haskell. Suggerisco la lettura di questo documento, che potrebbe creare un'impressione diversa sulla forza relativa del sistema di tipi di Scala (la tabella a pagina 17 serve come una bella lista di molto potenti concetti di sistema di tipo).

Non necessariamente legato alla potenza del sistema tipo è l'approccio compilatori del Haskell di Scala e utilizzare per inferire i tipi, anche se ha un certo impatto sul modo in cui le persone scrivono codice. Avere un potente algoritmo di inferenza può rendere la pena di scrivere codice più astratto (si può decidere da soli se questo è una buona cosa in tutti i casi).

Alla fine della Scala e tipo di sistema di Haskell sono guidati dal desiderio di fornire ai propri utenti con i migliori strumenti per risolvere i loro problemi, ma hanno preso strade diverse a questo obiettivo.

Un altro punto interessante da considerare è che Scala supporta direttamente l'OO-stile classico. Il che significa, ci sono sottotipo rapporti (ad esempio List è una sottoclasse di Seq). E questo rende l'inferenza dei tipi più complicato. Aggiungere a questo il fatto che si può mescolare in tratti in Scala, il che significa che un determinato tipo può avere più rapporti Supertype (il che rende ancora più difficile)

Scala non ha rango-n tipi , anche se può essere possibile < a href = "http://apocalisp.wordpress.com/2010/07/02/higher-rank-polymorphism-in-scala/" rel = "noreferrer"> aggirare questa limitazione in alcuni casi.

Ho solo poco experenice con Haskell, ma la cosa più ovvia Prendo atto che Scala sistema di tipo diverso da Haskell è il tipo di inferenza.

In Scala, non v'è alcuna inferenza di tipo globale, è necessario esplicito dire il tipo di argomenti delle funzioni.

Per esempio, a Scala è necessario scrivere questo:

def add (x: Int, y: Int) = x + y

anziché

add x y = x + y

Questo può causare problemi quando si ha bisogno versione generica di funzione di aggiungere che il lavoro con tutti i tipi di tipo ha il metodo del "+". C'è una soluzione per questo, ma otterrà più prolisso.

Ma nel reale utilizzo, ho trovato il sistema di tipi di Scala è abbastanza potente per l'utilizzo quotidiano, e ho quasi mai uso quelli soluzione per generici, forse questo è perché vengo da mondo Java.

E la limitazione della dichiarazione esplicita del tipo di argomenti non è necessaria una brutta cosa, è necessario documentare lo stesso.

Bene sono essi Turing riducibile?

See Oleg Kiselyov pagina http://okmij.org/ftp/ ... Si può implementare il lambda calcolo nel sistema dei tipi di Haskell. Se Scala può farlo, quindi in un certo senso sistema di tipo di Haskell e il sistema di tipi di Scala calcolano gli stessi tipi. Le domande sono: Come naturale è uno sopra l'altro? Come elegante è uno sopra l'altro?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top