53

Ho letto che il sistema di tipi di Scala è indebolito dall'interoperabilità di Java e quindi non può eseguire alcuni degli stessi poteri del sistema di tipi di Haskell. È vero? La debolezza è dovuta alla cancellazione dei caratteri o mi sbaglio in ogni modo? Questa differenza è la ragione per cui Scala non ha tipeclass?Svantaggi del sistema di tipo Scala rispetto a Haskell?

+1

Si consiglia di leggere questo. http://lambda-the-ultimate.org/taxonomy/term/32 –

+4

Sono abbastanza sicuro che Haskell abbia almeno la stessa cancellazione di tipo di Scala, per quello che vale. –

risposta

51

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

Questo non è guidato dalla cancellazione del tipo o da altri requisiti della JVM. Tutte le possibili difficoltà qui possono essere superate e considerate Jaskell - http://docs.codehaus.org/display/JASKELL/Home

L'inferenza H-M non funziona in un contesto orientato agli oggetti. Nello specifico, quando viene utilizzato il polimorfismo del tipo (in contrasto con il polimorfismo ad-hoc delle classi di tipi). Questo è cruciale per una forte interoperabilità con altre librerie Java e (in misura minore) per ottenere la migliore ottimizzazione possibile dalla JVM.

Non è proprio valido affermare che sia Haskell sia Scala abbiano un sistema di tipi più forte, solo che sono diversi. Entrambe le lingue stanno spingendo i limiti per la programmazione basata sui tipi in diverse direzioni, e ogni lingua ha punti di forza unici che sono difficili da duplicare nell'altro.

+0

Il capitolo 16 mostra i tipi di dati Scala e la corrispondenza di modelli che sviluppa un sistema di inferenza di tipo nello stile H/M http: //www.scala -lang.org/docu/files/ScalaByExample.pdf – oluies

+4

"L'inferenza HM non funziona in un contesto orientato agli oggetti". Ma F # implementa H-M e ha un lato orientato agli oggetti. –

+10

@Mauricio: Sì, e OCaml è un esempio di contatore ancora migliore perché inferisce tipi di classe ... –

13

un altro punto interessante da considerare è che Scala supporta direttamente lo stile OO classico. Il che significa che esistono le relazioni sottotipo (ad esempio, List è una sottoclasse di Seq). E questo rende l'inferenza di tipo più complicata. Aggiungete a questo il fatto che potete mescolare i tratti in Scala, il che significa che un dato tipo può avere più relazioni di supertipo (rendendolo ancora più complicato)

8

Ho solo poca esperienza con Haskell, ma la cosa più ovvia che ho si noti che il sistema di tipo Scala diverso da Haskell è l'inferenza del tipo.

In Scala, non esiste un'inferenza di tipo globale, è necessario indicare esplicitamente il tipo di argomenti della funzione.

Per esempio, a Scala è necessario scrivere questo:

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

invece di

add x y = x + y 

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

Ma in realtà, ho trovato che il sistema di tipi Scala è abbastanza potente per l'uso quotidiano, e non uso quasi mai quei rimedi per generici, forse perché vengo dal mondo Java.

E la limitazione di dichiarare esplicitamente il tipo di argomenti non è necessaria una cosa negativa, è comunque necessario documentarlo.

23

Il sistema di tipo Scala è diverso da quello di Haskell, anche se i concetti di Scala sono talvolta direttamente ispirati ai punti di forza di Haskell e alla sua comunità di ricercatori e professionisti.

Naturalmente, l'esecuzione su una VM non destinata principalmente alla programmazione funzionale in primo luogo crea alcuni problemi di compatibilità con le lingue esistenti che si rivolgono a questa piattaforma. Poiché la maggior parte del ragionamento sui tipi avviene in fase di compilazione, le limitazioni di Java (come linguaggio e piattaforma) in fase di runtime non sono nulla di cui preoccuparsi (eccetto Type Erasure, anche se esattamente questo bug sembra rendere l'integrazione nel Ecosistema Java più semplice).

Per quanto ne so l'unico "compromesso" sul livello di sistema di tipo con Java è una sintassi speciale per gestire i tipi di dati non elaborati. Sebbene Scala non permetta più nemmeno i Raw Type, accetta vecchi file di classi Java con quel bug. Forse avete visto il codice come List[_] (o l'equivalente più lungo List[T] forSome { type T }). Questa è una funzionalità di compatibilità con Java, ma viene trattata internamente come un tipo esistenziale e non indebolisce il sistema di tipi.

Il sistema di tipi Scala supporta type classes, anche se in modo più dettagliato di Haskell.Suggerisco di leggere questo articolo, che potrebbe creare un'impressione diversa sulla forza relativa del sistema di tipi di Scala (la tabella a pagina 17 funge da una bella lista di concetti di sistema di tipo molto potente).

Non necessariamente correlato alla potenza del sistema di tipi è l'approccio utilizzato dai compilatori di Scala e Haskell per dedurre i tipi, sebbene abbia un impatto sul modo in cui le persone scrivono il codice. Avere un algoritmo di inferenza di tipo potente può rendere utile scrivere un codice più astratto (puoi decidere da solo se è una buona cosa in tutti i casi).

Alla fine il sistema di tipi Scala e Haskell sono guidati dal desiderio di fornire ai propri utenti gli strumenti migliori per risolvere i loro problemi, ma hanno intrapreso percorsi diversi verso tale obiettivo.

+0

+1 per la menzione di quel tavolo. I tipi esistenti di –

+3

non sono esattamente la stessa cosa dei tipi non elaborati. Ad esempio, Elenco [_] non è considerato un tipo uguale a un altro elenco [_] –

6

Beh, sono riduttori di Turing?

Vedere la pagina di Oleg Kiselyov http://okmij.org/ftp/ ... Uno può implementare il calcolo lambda nel sistema di tipo Haskell. Se Scala può farlo, in un certo senso il sistema di tipi di Haskell e il sistema di tipi di Scala calcolano gli stessi tipi. Le domande sono: quanto sono naturali gli uni sugli altri? Quanto è elegante l'una rispetto all'altra?