Coherencia y reglas de instancias huérfanas en sistemas de tipos

Fuentes: Coherence and orphan instance rules

Las typeclasses (Haskell) y los traits (Rust) son mecanismos de sobrecarga que permiten resolver una llamada a método en función de los tipos de sus argumentos. Esta resolución descansa sobre una propiedad esencial: la coherencia. Un sistema de tipos es coherente cuando, para cualquier restricción generada por una llamada, existe a lo sumo una instancia que la satisfaga en todo el programa. Así se garantiza que operaciones como la función hash o la comparación de orden empleen siempre la misma implementación, preservando invariantes de estructuras como tablas hash o mapas ordenados.

La coherencia es una propiedad global. Si dos módulos son coherentes por separado pero, al combinarse, una misma restricción puede resolverse con dos instancias distintas, el programa entero deja de ser coherente. Para evitar esa fragmentación, los lenguajes imponen reglas de instancias huérfanas, que restringen dónde puede declararse una instancia — típicamente en el módulo que define el tipo o la clase, nunca en un módulo ajeno a ambos —, de modo que bibliotecas independientes puedan componerse sin colisiones.

Diseñar reglas modulares que aseguren coherencia global sin resultar excesivamente restrictivas es un problema no trivial. En Rust, por ejemplo, el RFC «Re-rebalancing coherence» redefine las reglas para permitir casos útiles y bloquear otros problemáticos. Las reglas de instancias huérfanas deben ir siempre aparejadas a las reglas de resolución de instancias; cambiadas unas, hay que revisar las otras. El autor señala que no existe apenas tratamiento formal de estas reglas con demostraciones de que solo permiten sistemas coherentes, y propone esa línea como oportunidad de investigación en diseño de lenguajes.