Abstrayendo efectos con continuaciones en Gleam

Fuentes: Abstracting effects with continuations

Este artículo explica cómo las continuaciones permiten escribir una sola versión de la lógica de negocio que funcione con distintos tipos de efectos: síncronos, fallibles o asíncronos. Parte de un ejemplo con una función fetch que recibe una clave y devuelve un valor: una versión devuelve directamente un String, otra un Result(String, Nil) para representar fallos, y una tercera un Promise(String) para esperar valores de forma asíncrona. Tener tres implementaciones distintas obliga a duplicar la lógica de negocio cada vez que cambia el tipo de efecto, y complica combinaciones como Promise(Result). La solución propuesta es una función task genérica que recibe un fetch envuelto en una continuación (Continuation(t, a)), donde a es el valor y t el detalle del cómputo todavía por especificar. La parte común —crear la clave y tratar el valor— queda definida una sola vez, y un runner (intérprete) se encarga de fijar t y la devolución final: identidad para el caso síncrono, Ok para Result, o promise.resolve para Promise. Así, una misma definición de la lógica se reutiliza con cualquier efecto, separando la lógica del efecto gracias a la abstracción de continuaciones. El texto está pensado para programadoras y programadores que trabajen en Gleam y quieran evitar duplicar lógica de negocio entre implementaciones con distintos efectos. Incluye ejemplos de código, pruebas y referencias al trabajo de Filinski (1994) sobre cómo las continuaciones pueden expresar cualquier mónada.