Este artículo aborda una pregunta común entre los desarrolladores de lenguajes de programación: ¿deberían usar un sistema de tipos Hindley-Milner (HM) o Bidireccional (Bidir)? La respuesta, según el autor, no es tan simple como elegir entre dos opciones mutuamente excluyentes. La verdadera pregunta que deben hacerse los desarrolladores es: ¿su lenguaje necesita o no soporte para genéricos?
Hindley-Milner (HM) se centra en la inferencia de tipos a través de la unificación, un proceso que asigna y resuelve variables de tipo. Sistemas como Rust utilizan la unificación para inferir tipos como Vec<T>. HM implica inherentemente la unificación.
Bidirectional Typing (Bidir), por otro lado, permite que las anotaciones de tipo influyan en el proceso de tipificación, con menos dependencia de la inferencia. Inicialmente, se pensó que Bidir no requería unificación, pero el artículo explica que Bidir es en realidad un superset de HM, lo que significa que puede incorporar la unificación sin problemas. De hecho, se puede implementar un sistema Bidir añadiendo una función check a un sistema HM existente, que inicialmente compara el tipo inferido con el tipo anotado y, posteriormente, puede usar la unificación.
La función check permite optimizaciones, como en el caso de las funciones, donde se puede evitar la inferencia completa y usar la información de tipo anotada directamente. Esto permite un control más granular sobre el proceso de tipificación.
La elección entre HM y Bidir no es una decisión aislada. Si el lenguaje necesita genéricos, la unificación se vuelve esencial, y por lo tanto, HM o un Bidir con unificación son las opciones más adecuadas. Si el objetivo es un lenguaje más simple, quizás para un ejercicio de aprendizaje o un lenguaje específico de dominio (DSL) que no requiere la flexibilidad de los genéricos, un sistema Bidir sin unificación podría ser suficiente. En última instancia, el artículo argumenta que, si se va a usar HM, añadir la capacidad bidireccional es una inversión de bajo costo que ofrece una mayor flexibilidad.
