Cada trait en tu arquitectura hexagonal es un algebra tagless-final. Cada impl es un interprete. Has estado escribiendo semantica denotacional sin saberlo. Trazamos la conexion desde el paper de Kiselyov a traves de Cats-Effect de Scala hasta los port traits de Rust, y mostramos por que el patron que los academicos llaman ‘finally tagless’ es el mismo patron que los practicantes llaman ‘inyeccion de dependencias.’
Agregar un nuevo tipo es facil en OOP, dificil en FP. Agregar una nueva operacion es facil en FP, dificil en OOP. Philip Wadler nombro esto el Expression Problem en 1998. Mostramos como se manifiesta en Rust y Scala, y anticipamos la resolucion.
Tu expresion match es semantica operacional. Tu funcion pura es semantica denotacional. El borrow checker de Rust es semantica axiomatica. Tres marcos formales, tres formas de asignar significado al codigo, y has estado usando los tres sin saberlo.
Al volver sobre el trait TaskRepository de la serie Todo CLI, me di cuenta de que no solo estaba dibujando una frontera arquitectónica. También estaba definiendo qué podía decirse en esa frontera, y eso se parece mucho más a una gramática de lo que pensé al principio.
Tercera parte de la serie: definimos el contrato de persistencia con un trait genérico, implementamos dos adaptadores (in-memory y JSON a disco) y profundizamos en la diferencia entre interfaz e implementación como eje de la arquitectura hexagonal.
Exploramos en detalle qué son las typeclasses, cómo se definen en Scala 2 y cómo se implementan en otros lenguajes como Haskell y Rust. A través de ejemplos prácticos, mostramos cómo modelar comportamientos de forma clara y escalable utilizando este poderoso patrón de diseño en la programación funcional. También analizamos la derivación automática y las mejoras que Scala 3 aporta en este ámbito.
Analizamos los distintos diseños de patrones funcionales para abordar la abstracción de una funcionalidad y su implementación.
Mis primeras impresiones de Rust desde un enfoque de programación funcional (Scala y Haskell). Una mezcla de emoción, frustración y un cambio de paradigma en la forma de pensar.