Usando continuaciones para evitar código spaghetti en threads y callbacks

Feb 15, 2018 19h
Encantado de recibir en GoMadrid a Alberto Gómez Corona que tratará de “domesticar” la monada de continuación (continuation monad).

Podéis inscribiros AQUÍ, aún quedan algunas plazas!

Esta mónada no ha respondido a lo que se esperaba en términos prácticos. Hubo un esfuerzo grande, teórico y práctico hace unas décadas pero actualmente se ha dejado de lado, en favor de soluciones mas sencillas para resolver el problema de “asincronía”, o sea, cuando hay que utilizar varios threads o existen callbacks es imposible codificar un programa como si fuera una sola expresión. Hay que partirlo en trozos. Esto lo podemos mejorar parcialmente. “Async-await” o las “promises” son soluciones imperfectas para “paliar” ese problema. Pero el caso es que la monada de continuación puede resolverlo en forma completa y bien. ¿ Por que no se ha hecho? La razón es que es que esta mónada tiene una formulación compleja y poco intuitiva. Además cuando se hacen ejemplos de continuaciones delimitadas es para demostrar su potencia haciendo efectos extraños que no son fáciles de entender porque no se acomodan a un razonamiento ecuacional. Se trata de domeñar esta mónada, reformular esta de una manera más sencilla utilizando las continuaciones bajo una serie de combinadores mas intuitivos de manera que la mónada de continuación sea indistinguible y funcione como una monada “normal”. Pero al mismo tiempo aprovechar la capacidad de las continuaciones. Para lo cual describiré:

1) Un combinador “async” para hacer operaciones con funciones que se ejecutan en distintos hilos como si estuvieran en uno solo, con lo cual obtenemos paralelismo y concurrencia sin perder la capacidad de componer elementos.

2) Un combinador “react” para que un framework llame nuestro código como si estuviera compuesto de callbacks, que sin embargo nosotros programamos como si no existieran.

3) Además veremos como implementar indeterminismo, backtracking y otros efectos que se pueden crear con continuaciones, como por ejemplo, el sistema de threads de Eta, que es la translación a la máquina Java del Glasgow Haskell compiler, que estamos haciendo con este tipo de continuación.

Bio de Alberto Gómez Corona, @AGoCorona
Licenciado en Físicas. Trabajo, en empresas privadas y públicas (españolas y europeas), en proyectos de software para la industria o I+D. Actualmente es Free Lance. Comenzó con el ZX Spectrum, trabajando en un compilador de Prolog, otro de Lisp y otro de C. Desde entonces no ha dejado de programar en diversos lenguajes, Fortran, C++, C#, Web/Javascript y algunas cosas en Java. Fascinado por Lisp, hace mas de 10 años descubrió Haskell. Es autor de unos cuantos paquetes, siempre con ideas extrañas, como “MFlow” (Web framework basado en continuaciones), “Workflow” (un paquete que salva y recupera el estado de ejecución) y “Transient” (un EDSL con combinadores) que permite lo que se describe en esta presentación y otros más. Lo presentó en LambdaConf/Denver en 2017 y en el 2016 en Lambda World Cádiz. Actualmente, entre otros proyectos, está colaborando en la creación del sistema de threads de Eta.