¿Cómo se vería C ++ si tuviera la inferencia de tipo Hindley-Milner?

La primera pregunta es cómo se vería C ++ si tuviera tipos estáticos fuertes con polimorfismo paramétrico.

C ++ necesitaría tener tipos estáticos fuertes, lo que significaría que ya no se nos permitiría usar números enteros como booleanos y todas esas cosas divertidas.

Para evitar que el programador subvierta las garantías de tipo mediante la sustitución de valores de un tipo por otro, C ++ también debería ser seguro para la memoria, lo que significa que necesitaríamos reemplazar toda la administración de memoria con administración automática de memoria.

Finalmente, tener polimorfismo paramétrico impondría restricciones (y orden) en la forma en que puede existir el polimorfismo, la capacidad de una clase o función para ser utilizada generalmente sobre valores de todo tipo.

El sistema de tipo Hindley-Milner garantiza que las funciones polimórficas paramétricas sean en realidad polimórficas paramétricas: por ejemplo, si una función tiene el tipo “\ forall a. A -> a” (donde -> es el tipo de función), esto solo * puede * ser La función de identidad. En C ++, este tipo de polimorfismo se manifiesta en plantillas, que permiten definir la funcionalidad sobre variables de tipo en lugar de tipos concretos. Las plantillas de C ++ son mucho más permisivas y requieren que las plantillas solo funcionen para los casos que aparecen en el código. Tener un sistema de tipo Hindley-Milner encima de esto permitiría que las funciones de plantilla existan solo si son lo suficientemente generales como para operar sobre argumentos de tipo * any *.

Si tuviéramos una inferencia de tipos en la parte superior de un sistema de tipos de estilo Hindley-Milner, tendríamos formas de omitir los tipos y las variables de tipo en las declaraciones de clase de plantilla. Sin embargo, C ++ necesitaría mensajes de error de plantilla mucho mejores, o el programador seguramente morirá.

Extremadamente diferente De hecho, probablemente se parecería más a OCaml que a C ++. Para incorporar un sistema de tipo Hindley-Milner, C ++ también tendría una recolección de basura.

Es extremadamente difícil implementar un motor de inferencia de tipos sobre un lenguaje con características explícitas de asignación y desasignación. El problema es que podría tener un puntero colgante que en realidad podría llenarse más tarde con un valor de un tipo diferente al que hace referencia un puntero diferente.

El sistema de tipos en C / C ++ está orientado principalmente a permitir que el compilador elija la representación de memoria correcta para los datos y no necesariamente para permitir la seguridad de los tipos. C y C ++ están débilmente tipados, a diferencia de Java y C #, sus primos más cercanos, que están más fuertemente tipados. Aunque este no es necesariamente un término riguroso, varias cosas hacen que C y C ++ estén tipados débilmente y, por lo tanto, no sean muy seguros. La capacidad de emitir cualquier valor a cualquier tipo y, de hecho, usar los bits que encuentre también descarta la seguridad de tipo

Así que creo que el lenguaje resultante sería un lenguaje de más alto nivel, con recolección de basura. Básicamente, está mirando OCaml sin un sistema de módulos, sin funciones de orden superior y una sintaxis tipo C.

C ++ en realidad tiene un sistema de inferencia de tipo HM. Si alguna vez leyó un tutorial para un lenguaje basado en ML, vería que casi todos los conceptos existen en C ++.

En C ++ 11, existe la inferencia de tipo real: palabra clave automática, que le permite omitir la definición de tipo y dejar que el sistema de inferencia de tipo la infiera por usted.