(Dis-) ventajas de la tipificación estructural

15

Acabo de ver esta charla de Daniel Spiewak donde él habla sobre las ventajas de tipificación estructural en comparación con tipificación nominal de Scala y en Java. Un ejemplo de esta diferencia sería el siguiente código Java

public interface Foo {
  public int length();
}
public interface Bar {
  public int length();
}

Foo f = ...;
Bar b = f;

que, por supuesto, no se compilaría porque la compatibilidad de tipos entre Foo y Bar está determinada por el nombre.

Por otro lado, un sistema de tipo estructural podría declarar que ambos tipos son iguales o compatibles y, por lo tanto, entre otras cosas, permitir la tipificación de pato controlado.

Ahora creo que entiendo la mayoría de las ventajas de un sistema de tipo estructural, pero me pregunto si no invalidaría la seguridad de tipos de ejemplos como los siguientes

class Foo {
  class Bar { /* ... */ }
  def takeBar(b: Bar) = { /* ... */ }
  def getBar: Bar = new Bar
}

val foo1 = new Foo
val foo2 = new Foo
foo1.takeBar(foo1.getBar) // should compile
foo1.takeBar(foo2.getBar) // should not compile

¿Tengo entendido que en un sistema de tipo estructural la última línea también se compilaría y, de ser así, no sería una desventaja con respecto a la seguridad de tipos?

    
pregunta Debilski 07.11.2011 - 15:20

2 respuestas

12

En realidad, los tipos dependientes de la trayectoria son ortogonales a la tipificación estructural versus nominal. No está realmente claro qué significa una clase interna en el contexto de un lenguaje simple de tipo estructurado. Sin embargo, es muy posible definir esto. Si tuviera que definir las clases internas en un contexto estructuralmente tipificado, tendría que asegurarse de que los casos como el que enumeró serían rechazados (precisamente por las mismas razones por las que Scala los rechaza).

Usted rechazaría tales casos haciendo lo mismo que Scala: modela el tipo dependiente de la ruta como un tipo existencial. El mismo procedimiento de empaquetar / desempaquetar que rodea el acceso a objetos se mantendría, y los resultados se verían casi idénticos a lo que hace Scala. Los resultados pueden parecer como una igualdad de tipo nominal, pero aún sería un sistema de tipo estructural, ya que la cuestión de la compatibilidad de tipo se decidirá en la interfaz en lugar del nombre.

La tipificación estructural tiene muchas implicaciones, pero (tal vez sorprendentemente) la mayoría de los mismos conceptos que todos conocemos y amamos de los sistemas de tipo nominal se transfieren a los estructurales. La tipificación estructural no es más que una forma diferente de definir la compatibilidad de tipos.

    
respondido por el Daniel Spiewak 07.11.2011 - 16:33
0

La tipificación estructural facilita la escritura de códigos de biblioteca genéricos. La razón número 1 por la que el ecosistema de Java está tan hinchado es porque es difícil escribir bibliotecas pequeñas fácilmente. Si Java estuviera escrito estructuralmente, creo que sería una historia diferente y una situación mucho mejor.

La única desventaja que puedo imaginar para la tipificación estructural es la posibilidad de una compilación más lenta. No estoy seguro de si los lenguajes estructurales generalmente se compilan más lentamente que los nominativos o no, pero, por ejemplo, Golang está estructuralmente escrito y es muy rápido en la compilación.

    
respondido por el Alexander Mills 21.12.2018 - 09:12

Lea otras preguntas en las etiquetas