Skip to main content

Tipos suma

⏱ Dedicación recomendada: 0 minutos
Esto considera el contenido visible y relevante, e ignora texto colapsado o marcado como opcional.


Un tipo suma es un tipo de datos que permite representar una elección entre múltiples posibilidades, donde un valor puede pertenecer a uno de varios tipos predefinidos. En Kotlin, los tipos suma se pueden implementar mediante mecanismos como las clases selladas o las enumeraciones. Este enfoque es útil en casos donde un valor puede adoptar diversas formas, como los días de la semana o los estados en una máquina de estados finitos.

Uno de los ejemplos más comunes de tipos suma es either, que modela un valor que puede ser de uno de dos tipos posibles. Al igual que Pair es representativo de los tipos producto, either es representativo de los tipos suma. Así como los tipos producto pueden componerse a partir de pares, cualquier tipo suma puede modelarse como una composición de instancias de either, proporcionando una forma flexible de estructurar decisiones en el código.

Los tipos suma son particularmente útiles en situaciones donde se debe modelar la posibilidad de alternativas claramente diferenciadas, como el éxito o el fallo en una operación, o diferentes variantes de un objeto en un sistema.

Soporte en otros lenguajes

  • Haskell: Utiliza tipos algebraicos de datos (data) para representar tipos suma, como en Either.
  • Scala: Utiliza clases selladas para representar conjuntos finitos de tipos. Scala 3 introduce union types y enumeraciones para manejar tipos suma.
  • F#: Usa las discriminated unions para definir tipos que representan varias opciones de valor.
  • Rust: Emplea las enumeraciones para manejar tipos suma, permitiendo que cada variante de la enumeración tenga su propia estructura de datos.
  • TypeScript: Introduce los union types para permitir que una variable pueda ser de varios tipos posibles.
  • Swift: Usa enumeraciones que pueden contener datos asociados para representar tipos suma.
  • OCaml: Utiliza variant types para definir tipos suma mediante constructores que representan diferentes casos de datos.

Estos lenguajes ofrecen mecanismos diferentes para trabajar con tipos suma, lo que los hace útiles en situaciones donde un valor puede tener múltiples formas o variantes.

Ejemplo Práctico: Modelando el estado de pedidos de una tienda en línea

En el contexto de un sistema para una tienda en línea, podríamos querer representar los estados de un pedido, como:

  • Pendiente
  • Pagado
  • Enviado
  • Entregado
  • Cancelado

Primer Enfoque: Uso de Strings

Para representar estados de un pedido en Kotlin, podríamos empezar usando strings. Sin embargo, este enfoque presenta riesgos, como errores en tiempo de ejecución debido a valores incorrectos o mal escritos:

fun handleOrderState(state: String) = when (state) {
"Pending" -> println("Order is pending")
"Paid" -> println("Order is paid")
"Shipped" -> println("Order is shipped")
"Delivered" -> println("Order is delivered")
"Cancelled" -> println("Order is cancelled")
else -> println("Unknown state")
}

En este caso, nada garantiza que state contenga un valor válido. Esto puede llevar a errores difíciles de identificar, especialmente cuando el valor no coincide con ninguno de los casos esperados. Para evitar estos problemas, podemos utilizar tipos suma, que nos permiten restringir los valores posibles. Más adelante, exploraremos cómo resolver esta situación usando clases selladas y enumeraciones.

Reflexión sobre probabilidad de error

Imaginemos que un pedido solo puede estar en uno de cinco estados posibles. Si elegimos un valor de state al azar, ¿qué probabilidad hay de que sea correcto? ¿Y si seleccionamos un string cualquiera? Es muy probable que un string al azar termine en el caso else, lo que en un sistema real podría llevar a errores importantes.

Aunque podemos mitigar esto usando constantes, la posibilidad de errores persiste. Un enfoque más seguro es utilizar tipos suma, garantizando en tiempo de compilación que solo valores válidos sean utilizados.

¿Qué aprendimos?

En esta lección, exploramos los tipos suma como una herramienta clave para representar alternativas bien definidas en el código. Aprendimos cómo pueden mejorar la seguridad y claridad en el desarrollo, especialmente en comparación con el uso de strings u otros enfoques menos restrictivos. Los tipos suma, implementados en Kotlin mediante clases selladas o enumeraciones, proporcionan varias ventajas:

  • Control de estados válidos: Al limitar los posibles valores a un conjunto específico, reducimos la probabilidad de errores en tiempo de ejecución.
  • Legibilidad y mantenibilidad: Al definir explícitamente las alternativas permitidas, el código resulta más claro, y el mantenimiento se facilita, ya que cualquier cambio en los posibles estados es centralizado y seguro.
  • Compatibilidad con patrones de diseño funcional: Al estructurar decisiones o representaciones de datos en forma de tipos suma, como en el caso de Either, facilitamos la programación funcional y su capacidad para manejar flujos de datos complejos de manera declarativa.

Los tipos suma son especialmente útiles en sistemas donde los valores deben ser claramente diferenciables y representar opciones exclusivas, como los estados de un pedido en una tienda en línea, y ofrecen una forma segura y predecible de manejar variaciones en el comportamiento y los datos de la aplicación.

Bibliografías Recomendadas

  • 📚 "6. Simple Algebraic Data Types". (2019). Bartosz Milewski, en Category Theory for Programmers, (pp. 55–68.) Millington Keynes.