2010-10-28 17 views
50

Ci sono affermazioni che il sistema di tipi di Scala sia completato da Turing. Le mie domande sono:Il sistema di tipi in Scala è completato da Turing. Prova? Esempio? Benefici?

  1. Esiste una prova formale per questo?

  2. Come apparirebbe un semplice calcolo nel sistema di tipi Scala?

  3. Questo è di qualche vantaggio per Scala - la lingua? Questo rende Scala più "potente" in qualche modo rispetto alle lingue senza un sistema di tipo completo di Turing?

Immagino che questo si applichi alle lingue e ai sistemi di tipi in generale.

+4

Preferirei avere un sistema di tipo non universale e un compilatore veloce. – ziggystar

+0

@ziggystar cosa si otterrebbe con la velocità di compilazione che probabilmente si perderebbe in tempo di sviluppo e di debug. – BAR

risposta

35

C'è un post di blog da qualche parte con un'implementazione di livello tipo del calcolo del combinatore SKI, che è noto per essere completato da Turing.

I sistemi di tipo Turing-completi hanno sostanzialmente gli stessi vantaggi e gli stessi inconvenienti dei linguaggi completi di Turing: puoi fare qualsiasi cosa, ma puoi dimostrarti molto poco. In particolare, non puoi provare che alla fine farai qualcosa.

Un esempio di calcolo a livello di carattere sono i nuovi trasformatori di raccolta preservazione di tipo in Scala 2.8. In Scala 2.8, metodi come map, filter e così via sono garantiti per restituire una collezione dello stesso tipo su cui sono stati chiamati. Quindi, se si filter a Set[Int], si ottiene un Set[Int] e se si map a List[String] si ottiene un List[Whatever the return type of the anonymous function is].

Ora, come potete vedere, map può effettivamente trasformare il tipo di elemento. Quindi, cosa succede se il nuovo tipo di elemento non può essere rappresentato con il tipo di raccolta originale? Esempio: a BitSet può contenere solo numeri interi a larghezza fissa. Quindi, cosa succede se si dispone di un BitSet[Short] e si mappa ogni numero con la sua rappresentazione di stringa?

someBitSet map { _.toString() } 

Il risultato sarebbe essere un BitSet[String], ma questo è impossibile. Quindi, Scala sceglie il supertipo più derivato di BitSet, che può contenere un String, che in questo caso è un Set[String].

Tutto questo calcolo è in corso durante di compilazione, o più precisamente durante tipo tempo controllo, utilizzando le funzioni di tipo-livello. Pertanto, è staticamente garantito che sia sicuro per il tipo, anche se i tipi sono effettivamente calcolati e quindi non noti in fase di progettazione.

+14

Immagino che questo sia il post del blog che stavi cercando? http://michid.wordpress.com/2010/01/29/scala-type-level-encoding-of-the-ski-calculus/. Scala mi è sembrato un linguaggio pulito quando l'ho guardato per la prima volta; quell'inferenza della superclasse è una caratteristica * davvero * interessante. –

+6

Risposta eccellente, sebbene l'esempio delle raccolte sia un po 'corto. Mentre il type checker sta sicuramente facendo delle euristiche interessanti per ottenere il miglior tipo di raccolta risultante in fase di compilazione, non è un buon esempio di computazione a livello di codice poiché il sistema di tipo * stesso * non sta facendo alcun lavoro. Sfortunatamente (o forse, per fortuna), non ci sono molti esempi di codice del mondo reale che faccia la programmazione a livello di codice, semplicemente perché è così difficile, ingombrante e irrinunciabile. –

+0

Grazie Jörg per il grande esempio e Daniel per i chiarimenti. Ora ho paura di chiedere se il controllo del tipo è Turing completo ... – Adrian

33

Il mio blog post sulla codifica del calcolo SCI nel sistema di tipo Scala mostra la completezza di Turing.

Per alcuni semplici calcoli a livello di testo sono disponibili anche alcuni esempi su come codificare i numeri naturali e l'aggiunta/multiplication.

Infine, vi è un ottimo series of articles sulla programmazione a livello di tipo sul blog di Apocalisp.

+0

michid, che sembra impressionante. Prometto di dare un'occhiata migliore quando crescerò ... Potrebbe non essere una prova FORMALE, ma potrebbe appartenere a questa lista? http://en.wikipedia.org/wiki/Computer-assisted_proof#List_of_theorems_proved_with_the_help_of_computer_programs – Adrian

+2

@Adrian, l'unica prova formale conosciuta della completezza di Turing è la capacità di implementare qualcos'altro che è completo. In genere questo significa una macchina universale, ma la teoria vale anche se si utilizza qualcos'altro che è noto per essere completo come il calcolo SCI o Perl o Javascript. Pertanto vorrei affermare che questa è una prova formale. – slebetman

+2

Va anche notato che nulla di praticamente implementabile è veramente completo perché è impossibile avere memoria infinita. Anche se utilizzi tutta la materia dell'universo per costruire la tua CPU/interprete, non sarebbe ancora completa. Ciò a cui praticamente ci riferiamo come turing completo è in realtà la memoria completa completa entro i limiti della memoria disponibile. – slebetman