Diferencias entre tipos union y sum en lenguajes de programación

Fuentes: Union vs sum types: technical differences in programming languages

Los tipos union y sum son conceptos fundamentales en la teoría de tipos de programación, aunque a menudo se confunden. Mientras que los tipos product (o structs) representan la combinación de campos mediante un operador lógico AND, los tipos union representan la disyunción de opciones mediante un operador OR. La distinción técnica radica en cómo se manejan los valores y la compatibilidad entre lenguajes.

En los lenguajes estáticos como Rust, los tipos sum (conocidos como enums) requieren un 'envoltorio' forzado: las variantes no existen como tipos independientes, sino como parte de un tipo compuesto. Esto implica que no se pueden acceder directamente a las variantes sin desempaquetarlas, generando código redundante (boilerplate) para operaciones básicas como el desempaquetado de Option o Result. Además, esta estructura impide cambios de firma de función que amplíen o estrechen el tipo de retorno, lo que limita la flexibilidad en la API.

Por el contrario, en lenguajes dinámicos como Julia, los tipos se tratan como conjuntos de valores. La deduplicación automática de tipos superconjuntos permite que Union{Int, Integer} se simplifique a Union{Int, Char}, facilitando operaciones matemáticas directas y evitando el desempaquetado manual. En Julia, los tipos union no existen en tiempo de ejecución, pero su sistema de inferencia permite que el compilador optimice el tipo de retorno dinámicamente, ofreciendo mayor flexibilidad y menor sobrecarga de código en comparación con el enfoque de Rust.