2010-10-28 20 views
50

Existen reclamos de que el sistema de tipos de Scala está completo. Mis preguntas son:El sistema de tipos en Scala es Turing completo. ¿Prueba? ¿Ejemplo? Beneficios?

  1. ¿Hay alguna prueba formal de esto?

  2. ¿Cómo se vería un simple cálculo en el sistema de tipo Scala?

  3. ¿Esto es beneficioso para Scala - el lenguaje? ¿Esto hace que Scala sea más "poderosa" de alguna manera en comparación con los idiomas sin un sistema de tipo Turing completo?

Supongo que esto se aplica a los idiomas y sistemas de tipo en general.

+4

Preferiría tener un sistema de tipo no universal y un compilador rápido en su lugar. – ziggystar

+0

@ziggystar lo que ganarías en velocidad de compilación que probablemente perderías en tiempo de desarrollo y depuración. – BAR

Respuesta

35

Hay una publicación de blog en algún lugar con una implementación de nivel de tipo del cálculo del combinador SKI, que se conoce como Turing-complete.

Los sistemas de tipo Turing-complete tienen básicamente los mismos beneficios y desventajas que tienen los lenguajes completos de Turing: puede hacer cualquier cosa, pero puede probar muy poco. En particular, no puedes probar que eventualmente harás algo.

Un ejemplo de computación a nivel de tipo son los nuevos transformadores de recolección de preservación de tipo en Scala 2.8. En Scala 2.8, se garantiza que métodos como map, filter y demás devuelvan una colección del mismo tipo en el que fueron llamados. Por lo tanto, si filter a Set[Int], obtiene un Set[Int] y si map a List[String] obtiene un List[Whatever the return type of the anonymous function is].

Ahora, como puede ver, map puede transformar el tipo de elemento. Entonces, ¿qué ocurre si el nuevo tipo de elemento no se puede representar con el tipo de colección original? Ejemplo: un BitSet solo puede contener enteros de ancho fijo. Entonces, ¿qué sucede si tiene un BitSet[Short] y asigna cada número a su representación de cadena?

someBitSet map { _.toString() } 

El resultado sería ser un BitSet[String], pero eso es imposible. Entonces, Scala elige el supertipo más derivado de BitSet, que puede contener un String, que en este caso es un Set[String].

Todo este cálculo está sucediendo durante el tiempo de compilación , o más precisamente durante el tiempo tipo comprobar, utilizando las funciones de nivel tipo. Por lo tanto, está garantizado estáticamente como seguro para el tipo, aunque los tipos se calculan realmente y, por lo tanto, no se conocen en el momento del diseño.

+14

Imagino que esta es la publicación del blog que estabas buscando? http://michid.wordpress.com/2010/01/29/scala-type-level-encoding-of-the-ski-calculus/. Scala parecía un lenguaje limpio cuando lo vi por primera vez; esa inferencia de superclase es una característica * realmente * genial. –

+6

Excelente respuesta, aunque el ejemplo de colecciones es un poco corto. Si bien el verificador de tipos ciertamente está realizando heurísticas interesantes para obtener el mejor tipo de recopilación resultante en tiempo de compilación, no es un buen ejemplo de cálculo a nivel de tipo ya que el sistema de tipo * en sí mismo * no está realmente haciendo ningún trabajo. Desafortunadamente (o tal vez, afortunadamente), no hay muchos ejemplos de código del mundo real que realicen programación a nivel de tipo, simplemente porque es tan difícil, torpe e imposible de mantener. –

+0

Gracias Jörg por el gran ejemplo y Daniel por aclaración. Ahora me da miedo preguntar si el verificador de tipos es Turing Complete ... – Adrian

33

Mi blog post en la codificación del cálculo de SKI en el sistema de tipo Scala muestra la integridad de Turing.

Para algunos cálculos de nivel de tipo simple también hay algunos ejemplos sobre cómo codificar los números naturales y la suma/multiplication.

Finalmente hay una gran series of articles en la programación de nivel de nivel en el blog de Apocalisp.

+0

michid, que se ve impresionante. Prometo mirar más de cerca cuando sea grande ... ¿Puede que esta no sea una prueba FORMAL, pero puede pertenecer a esta lista? http://en.wikipedia.org/wiki/Computer-assisted_proof#List_of_theorems_proved_with_the_help_of_computer_programs – Adrian

+2

@Adrian, la única prueba formal conocida de la integridad de Turing es la capacidad de implementar algo más que se está completando. Por lo general, esto significa una máquina de turing universal, pero la teoría es válida incluso si utiliza otra cosa que se sabe que está completa como cálculo de SKI o Perl o Javascript. Por lo tanto, yo diría que esta es una prueba formal. – slebetman

+2

También se debe tener en cuenta que prácticamente nada implementable está realmente completo porque es imposible tener memoria infinita. Incluso si agota toda la materia en el universo para construir su CPU/intérprete, aún no estaría realmente completo. Lo que prácticamente llamamos turing completo es realmente turing-complete-within-limits-of-available-memory. – slebetman

Cuestiones relacionadas