Entendiendo Monadas, Comonadas y Transductores en Programación
Aprende sobre conceptos clave de programación para mejorar el manejo de datos y la gestión de errores.
― 5 minilectura
Tabla de contenidos
- ¿Qué son los Monads?
- Componentes Básicos de los Monads
- ¿Qué son los Comonads?
- Componentes Básicos de los Comonads
- ¿Qué son los Transductores?
- El Papel de los Transductores
- ¿Cómo se Relacionan los Monads, Comonads y Transductores?
- Ejemplos en Programación
- Aplicaciones Prácticas
- Procesamiento de Datos
- Manejo de Errores
- Cálculos con Estado
- Conclusión
- Fuente original
- Enlaces de referencia
En el mundo de la informática, especialmente en lenguajes de programación y áreas relacionadas, entender ciertos conceptos puede mejorar mucho cómo diseñamos e implementamos algoritmos. Entre estos conceptos están los monads, Comonads y Transductores. Estos términos pueden sonar complicados, pero tienen aplicaciones prácticas en programación y ayudan a simplificar problemas complejos.
Este artículo explicará qué son los monads, comonads y transductores, cómo se relacionan entre sí y sus usos en programación. También veremos ejemplos para aclarar estas ideas.
¿Qué son los Monads?
Los monads son una forma de estructurar programas. Nos permiten encadenar operaciones de manera limpia y manejable. Piensa en un monad como una herramienta que ayuda a manejar efectos secundarios en programación, como lidiar con estados, entrada/salida (I/O) o errores, sin desordenar nuestra lógica principal.
Componentes Básicos de los Monads
Un monad consta de tres componentes principales:
- Tipo: Esto define con qué tipo de datos trabaja el monad.
- Función Unit: Esto toma un valor regular y lo envuelve en el monad.
- Función Bind: Esto toma un monad y una función, aplica la función al valor dentro del monad y devuelve un nuevo monad.
Estos componentes permiten encadenar operaciones. Por ejemplo, si tienes un monad que representa un valor que podría fallar, puedes encadenar operaciones de tal manera que si una operación falla, las demás no se ejecutan.
¿Qué son los Comonads?
Los comonads se pueden ver como el dual de los monads. Mientras que los monads generan valores, los comonads ayudan a extraer o analizar valores. Son útiles cuando el contexto alrededor de un valor es importante.
Componentes Básicos de los Comonads
Al igual que los monads, los comonads también tienen tres componentes principales:
- Tipo: Define los datos con los que trabaja el comonad.
- Función Extract: Esta recupera el valor de un comonad.
- Función Extend: Esta aplica una función al comonad y devuelve un nuevo comonad que contiene información adicional.
Los comonads son especialmente útiles en situaciones donde necesitamos llevar contexto o seguir la pista de información adicional mientras procesamos datos.
¿Qué son los Transductores?
Los transductores son un concepto más complejo que se puede entender como transformaciones entre Tipos de datos. Funcionan tomando una entrada, procesándola y produciendo una salida, a menudo manteniendo alguna forma de estructura.
El Papel de los Transductores
Los transductores pueden manejar muchos tipos de datos, transformándolos de una forma a otra. Por ejemplo, pueden convertir una lista de números en sus valores al cuadrado o cambiar el formato de los datos textuales.
Los transductores suelen construirse utilizando monads y comonads, aprovechando sus características para gestionar entrada y salida de manera efectiva.
¿Cómo se Relacionan los Monads, Comonads y Transductores?
Los monads, comonads y transductores pueden trabajar juntos sin problemas. Específicamente, los transductores a menudo utilizan monads para manejar valores y comonads para extraer contexto. Esta interacción permite un manejo robusto de las transformaciones de datos manteniendo la claridad.
Ejemplos en Programación
Aquí van algunos ejemplos de cómo se pueden aplicar estos conceptos en programación.
Monads: En lenguajes de programación funcional como Haskell, el monad Maybe se puede usar para manejar operaciones que podrían fallar. Por ejemplo, si intentas recuperar un valor de una lista, podrías obtener Nothing si la lista está vacía, asegurando un manejo de errores limpio.
Comonads: En ciertas aplicaciones, como la programación reactiva funcional, los comonads pueden usarse para gestionar cálculos con estado. Permiten a los programadores extraer valores de manera sensible al contexto, facilitando la construcción de aplicaciones interactivas.
Transductores: Bibliotecas en varios lenguajes de programación permiten transformaciones de datos fáciles. Por ejemplo, un transductor podría tomar una colección de datos, aplicar un filtro y transformar los datos todo en uno sin pasos intermedios.
Aplicaciones Prácticas
Procesamiento de Datos
Una de las aplicaciones más comunes de los monads es en pipelines de procesamiento de datos. Los programadores pueden construir una serie de transformaciones que representan el flujo de datos de una etapa a otra. Este enfoque ayuda a simplificar operaciones complejas al desglosarlas en piezas más pequeñas y manejables.
Manejo de Errores
Los monads ofrecen una forma de manejar errores de manera elegante. En lugar de verificar errores en cada paso del cálculo, la estructura del monad permite un manejo de errores centralizado. Por ejemplo, en una aplicación web, un monad podría encapsular respuestas para asegurar que si una operación encuentra un error, las demás operaciones se omiten de manera segura.
Cálculos con Estado
Los comonads son particularmente poderosos al manejar cálculos con estado. En aplicaciones como juegos o simulaciones, donde el estado cambia a lo largo del tiempo, los comonads permiten gestionar esta complejidad manteniendo el contexto relevante durante los cálculos.
Conclusión
Los monads, comonads y transductores son conceptos poderosos que pueden simplificar las tareas de programación. Ofrecen enfoques estructurados para manejar transformaciones de datos, gestionar estados y lidiar con errores. Al entender estos conceptos, los programadores pueden escribir código más limpio y mantenible y construir aplicaciones robustas.
Este artículo ha intentado desmitificar estos temas y proporcionar una base para considerar cómo podrían aplicarse de manera práctica. Ya seas nuevo en programación o un desarrollador experimentado, incorporar estas ideas en tu trabajo puede mejorar tu caja de herramientas para resolver problemas.
Título: Monads, Comonads, and Transducers
Resumen: This paper proposes a definition of recognizable transducers over monads and comonads, which bridges two important ongoing efforts in the current research on regularity. The first effort is the study of regular transductions, which extends the notion of regularity from languages into word-to-word functions. The other important effort is generalizing the notion of regular languages from words to arbitrary monads, introduced in arXiv:1502.04898. In this paper, we present a number of examples of transducer classes that fit the proposed framework. In particular we show that our class generalizes the classes of Mealy machines and rational transductions. We also present examples of recognizable transducers for infinite words and a specific type of trees called terms. The main result of this paper is a theorem, which states the class of recognizable transductions is closed under composition, subject to some coherence axioms between the structure of a monad and the structure of a comonad. Due to its complexity, we formalize the proof of the theorem in Coq Proof Assistant. In the proof, we introduce the concepts of a context and a generalized wreath product for Eilenberg-Moore algebras, which could be valuable tools for studying these algebras.
Autores: Rafał Stefański
Última actualización: 2024-07-02 00:00:00
Idioma: English
Fuente URL: https://arxiv.org/abs/2407.02704
Fuente PDF: https://arxiv.org/pdf/2407.02704
Licencia: https://creativecommons.org/licenses/by/4.0/
Cambios: Este resumen se ha elaborado con la ayuda de AI y puede contener imprecisiones. Para obtener información precisa, consulte los documentos originales enlazados aquí.
Gracias a arxiv por el uso de su interoperabilidad de acceso abierto.
Enlaces de referencia
- https://orcid.org/0000-0002-8439-4056
- https://creativecommons.org/licenses/by/3.0/
- https://q.uiver.app/#q=WzAsNyxbMCwwLCJNIFxcLCBNIFxcLCBYIl0sWzMsMCwiTSBcXCwgWCJdLFswLDIsIk0gXFwsIFgiXSxbMywyLCJYIl0sWzUsMCwiWCJdLFs3LDAsIk1cXCwgWCJdLFs3LDIsIlgiXSxbMCwyLCJcXG11X1giXSxbMCwxLCJNIFxcLCBcXGFscGhhIiwyXSxbMiwzLCJcXGFscGhhIl0sWzEsMywiXFxhbHBoYSIsMl0sWzQsNiwiXFx0ZXh0cm17aWR9X1giLDFdLFs0LDUsIlxcZXRhX1giXSxbNSw2LCJcXGFscGhhIl1d
- https://q.uiver.app/#q=WzAsMTUsWzAsMiwiTSBcXFNpZ21hIl0sWzIsMCwiTSBTIl0sWzYsMCwiTSBNUyJdLFs2LDQsIk0gUyJdLFs2LDcsIk0gXFxHYW1tYSJdLFsyLDcsIk0gMSJdLFs0LDIsIk0gTSBcXFNpZ21hIl0sWzIsNCwiTSBcXFNpZ21hIl0sWzQsMywiKDUpIl0sWzMsMSwiKDEpIl0sWzIsMywiKDIpIl0sWzEsNCwiKDMpIl0sWzMsNCwiKDQpIl0sWzUsMywiKDYpIl0sWzUsNiwiKDcpIl0sWzQsNSwiTSEiXSxbMyw0LCJNIFxcbGFtYmRhIiwxXSxbMyw1LCJNICEiLDEseyJzdHlsZSI6eyJib2R5Ijp7Im5hbWUiOiJkYXNoZWQifX19XSxbMiwzLCJNIFxcYWxwaGEiLDFdLFsyLDUsIk0hIiwxLHsic3R5bGUiOnsiYm9keSI6eyJuYW1lIjoiZGFzaGVkIn19fV0sWzEsMiwiXFxkZWx0YSIsMV0sWzAsMSwiTSBoIiwxXSxbMCw1LCJNISIsMl0sWzAsNiwiXFxkZWx0YSIsMSx7InN0eWxlIjp7ImJvZHkiOnsibmFtZSI6ImRhc2hlZCJ9fX1dLFs2LDIsIk1NaCIsMSx7InN0eWxlIjp7ImJvZHkiOnsibmFtZSI6ImRhc2hlZCJ9fX1dLFs2LDcsIk0gXFx2YXJlcHNpbG9uIiwxLHsic3R5bGUiOnsiYm9keSI6eyJuYW1lIjoiZGFzaGVkIn19fV0sWzAsNywiaWQiLDEseyJzdHlsZSI6eyJib2R5Ijp7Im5hbWUiOiJkYXNoZWQifX19XSxbNyw1LCJNISIsMSx7InN0eWxlIjp7ImJvZHkiOnsibmFtZSI6ImRhc2hlZCJ9fX1dLFs2LDUsIk0hIiwxLHsic3R5bGUiOnsiYm9keSI6eyJuYW1lIjoiZGFzaGVkIn19fV1d
- https://q.uiver.app/#q=WzAsMTEsWzAsMCwiTVxcLCBNIFxcLCBYIl0sWzIsMCwiTSBcXCwgWCJdLFswLDIsIk0gXFwsIFgiXSxbMiwyLCJYIl0sWzMsMCwiWCJdLFs1LDAsIk0gWCJdLFszLDIsIk0gWCJdLFs1LDIsIk0gTSBYIl0sWzYsMCwiWCJdLFs4LDAsIk0gWCJdLFs4LDIsIlgiXSxbMCwxLCJcXG11X1ggIl0sWzEsMywiXFx2YXJlcHNpbG9uX1ggIl0sWzAsMiwiXFx2YXJlcHNpbG9uX3tNIFh9IiwyXSxbMiwzLCJcXHZhcmVwc2lsb25fWCIsMl0sWzQsNSwiXFxldGFfWCJdLFs0LDYsIlxcZXRhX1giLDJdLFs2LDcsIk0gXFxldGFfWCIsMl0sWzUsNywiXFxkZWx0YV9YIl0sWzgsOSwiXFxldGFfWCJdLFs5LDEwLCJcXHZhcmVwc2lsb25fWCJdLFs4LDEwLCJpZCIsMl1d
- https://q.uiver.app/#q=WzAsNCxbMCwwLCJNXFwsIE0gXFwsIFgiXSxbMiwwLCJNIFxcLCBYIl0sWzAsMiwiTSBcXCwgWCJdLFsyLDIsIlgiXSxbMCwxLCJcXG11X1ggIl0sWzEsMywiXFx2YXJlcHNpbG9uX1ggIl0sWzAsMiwiXFx2YXJlcHNpbG9uX3tNIFh9IiwyXSxbMiwzLCJcXHZhcmVwc2lsb25fWCIsMl1d
- https://q.uiver.app/#q=WzAsMTAsWzAsMCwiTSBcXCwgQSJdLFsyLDAsIk1cXCwgQSBcXHRpbWVzIEEiXSxbMiwyLCJNXFwsIEEiXSxbMywwLCJNIEEgXFx0aW1lcyBBIl0sWzUsMCwiTSBBICJdLFs1LDIsIkEiXSxbNiwwLCIoTSBBIFxcdGltZXMgQSkgXFx0aW1lcyBBICJdLFs4LDAsIk0gQSAgXFx0aW1lcyBBIl0sWzYsMiwiTSBBIFxcdGltZXMgQSAiXSxbOCwyLCJNIEEgIl0sWzAsMiwiaWQiLDFdLFswLDEsIlxcbGFuZ2xlIGlkLFxcLCBcXHZhcmVwc2lsb25fQSBcXHJhbmdsZSAiLDFdLFsxLDIsIlxcdGV4dHR0e3B1dH1fQSIsMV0sWzMsNSwiXFxwaV8yICIsMV0sWzQsNSwiXFx2YXJlcHNpbG9uX0EiLDFdLFszLDQsIlxcbWF0aHR0e3B1dH1fQSAiLDFdLFs3LDksIlxcbWF0aHR0e3B1dH1fQSIsMV0sWzgsOSwiXFxtYXRodHR7cHV0fV9BIiwxXSxbNiw4LCJcXHBpXzIgXFx0aW1lcyBcXG1hdGh0dHtpZH0iLDFdLFs2LDcsIlxcbWF0aHR0e3B1dH1fQSBcXHRpbWVzIGlkIiwxXV0=
- https://q.uiver.app/#q=WzAsMTAsWzAsMCwiTSBNIEEgXFx0aW1lcyBNIEEgXFx0aW1lcyBBIl0sWzIsMCwiTSBNIEEgXFx0aW1lcyBNIEEgIl0sWzMsMCwiTSBNIEEgIl0sWzMsMiwiTSBBICJdLFswLDIsIk0gTSBBIFxcdGltZXMgQSAiXSxbMiwyLCJNIEEgXFx0aW1lcyBBIl0sWzQsMCwiQSBcXHRpbWVzIEEiXSxbNCwyLCJBIl0sWzYsMiwiTSBBIl0sWzYsMCwiTUEgXFx0aW1lcyBBIl0sWzUsMywiXFxtYXRodHR7cHV0fV9BIl0sWzQsNSwiXFxtdV9BIFxcdGltZXMgaWQiXSxbMCw0LCJcXG1hdGh0dHtwdXR9X3tNIEF9IFxcdGltZXMgaWQiLDFdLFswLDEsImlkIFxcdGltZXMgXFxtYXRodHR7cHV0fV9BIl0sWzEsMiwiXFxtYXRodHR7cHV0fV97TSBBfSJdLFsyLDMsIlxcbXVfQSIsMV0sWzYsNywiXFxwaV8yIl0sWzcsOCwiXFxldGFfQSJdLFs2LDksIlxcZXRhX0EgXFx0aW1lcyBpZCAiLDJdLFs5LDgsIlxcbWF0aHR0e3B1dH1fQSIsMl1d
- https://q.uiver.app/#q=WzAsNixbMCwwLCJNIE0gQSBcXHRpbWVzIE0gQSBcXHRpbWVzIEEiXSxbMiwwLCJNIE0gQSBcXHRpbWVzIE0gQSAiXSxbNCwwLCJNIE0gQSAiXSxbNCwyLCJNIEEgIl0sWzAsMiwiTSBNIEEgXFx0aW1lcyBBICJdLFsyLDIsIk0gQSBcXHRpbWVzIEEiXSxbNSwzLCJcXG1hdGh0dHtwdXR9X0EiXSxbNCw1LCJcXG11X0EgXFx0aW1lcyBpZCJdLFswLDQsIlxcbWF0aHR0e3B1dH1fe00gQX0gXFx0aW1lcyBpZCIsMV0sWzAsMSwiaWQgXFx0aW1lcyBcXG1hdGh0dHtwdXR9X0EiXSxbMSwyLCJcXG1hdGh0dHtwdXR9X3tNIEF9Il0sWzIsMywiXFxtdV9BIiwxXV0=
- https://q.uiver.app/#q=WzAsNSxbMCwyLCJNIE0gQSJdLFsyLDMsIk0gQSJdLFs0LDIsIk0gTSBBICJdLFsxLDAsIk0gTSBNIEEiXSxbMywwLCJNIE0gTSBBIl0sWzAsMSwiXFxtdV9BIiwxXSxbMSwyLCJcXGRlbHRhX0EiLDFdLFs0LDIsIlxcbXVfe00gQX0iLDFdLFswLDMsIlxcZGVsdGFfe00gQX0iLDFdLFszLDQsIk0gXFx0ZXh0cm17d29ya30iXV0=
- https://q.uiver.app/#q=WzAsMTIsWzAsMCwiTSBcXFNpZ21hIl0sWzEsMCwiTSBTXzEiXSxbMiwwLCJNIE1TXzEgIl0sWzMsMCwiTSBTXzEiXSxbNCwwLCJNIFxcR2FtbWEiXSxbNCwxLCJNIFNfMiJdLFs0LDIsIk0gTSBTXzIiXSxbNCwzLCJNIFNfMiJdLFs0LDQsIk0gXFxEZWx0YSJdLFsxLDEsIk0gU18zIl0sWzIsMiwiTSBNIFNfMyJdLFszLDMsIk0gU18zIl0sWzAsMSwiTSBoXzEiXSxbMSwyLCJcXGRlbHRhIl0sWzIsMywiTSBcXG1hdGh0dHtwcm9kfV8xIl0sWzMsNCwiTSBcXGxhbWJkYV8xIl0sWzQsNSwiTSBoXzIiXSxbNSw2LCJcXGRlbHRhIl0sWzYsNywiTSBcXG1hdGh0dHtwcm9kXzJ9Il0sWzcsOCwiTSBcXGxhbWJkYV8yIl0sWzAsOSwiTSBoXzMiLDIseyJzdHlsZSI6eyJib2R5Ijp7Im5hbWUiOiJkYXNoZWQifX19XSxbOSwxMCwiXFxkZWx0YSIsMix7InN0eWxlIjp7ImJvZHkiOnsibmFtZSI6ImRhc2hlZCJ9fX1dLFsxMCwxMSwiTSBcXG1hdGh0dHtwcm9kfV8zIiwyLHsic3R5bGUiOnsiYm9keSI6eyJuYW1lIjoiZGFzaGVkIn19fV0sWzExLDgsIk0gXFxsYW1iZGFfMyIsMix7InN0eWxlIjp7ImJvZHkiOnsibmFtZSI6ImRhc2hlZCJ9fX1dXQ==
- https://q.uiver.app/#q=WzAsOCxbMCwwLCJNIFxcLCBNIFxcLCBYIl0sWzMsMCwiTVxcLCBYIl0sWzAsMiwiTSBcXCwgTSBcXCwgWSJdLFszLDIsIk0gXFwsIFkiXSxbNSwwLCJYIl0sWzUsMiwiWSJdLFs4LDAsIk1cXCwgWCJdLFs4LDIsIk0gXFwsIFkiXSxbMCwxLCJcXG11X1giXSxbMCwyLCJNIChNXFwsICBmKSIsMl0sWzEsMywiTSBcXCwgZiJdLFsyLDMsIlxcbXVfWSJdLFs0LDUsImYiXSxbNiw3LCJNXFwsIGYiXSxbNCw2LCJcXGV0YV9YIl0sWzUsNywiXFxldGFfWSJdXQ==
- https://q.uiver.app/#q=WzAsOCxbMCwwLCJNXFwsIE0gXFwsIE0gXFwsIFgiXSxbMywwLCJNXFwsIE1cXCwgWCJdLFszLDIsIk0gXFwsIFgiXSxbMCwyLCJNIFxcLCBNIFxcLCBYIl0sWzUsMCwiTVxcLCBYIl0sWzcsMCwiTSBcXCwgTSBcXCwgWCJdLFs3LDIsIk1cXCwgWCJdLFs1LDIsIk1cXCwgTVxcLCBYIl0sWzAsMSwiXFxtdV97TVh9Il0sWzEsMiwiXFxtdV9YIl0sWzMsMiwiXFxtdV9YIl0sWzAsMywiTSBcXG11X1giLDJdLFs0LDUsIlxcZXRhX3tNIFh9IiwyXSxbNSw2LCJcXG11IF9YIiwyXSxbNCw2LCJcXHRleHRybXtpZH0iLDFdLFs0LDcsIk1cXCwgXFxldGFfWCIsMix7Im9mZnNldCI6LTF9XSxbNyw2LCJcXG11X1giXV0=
- https://q.uiver.app/#q=WzAsOCxbMywwLCJNXFwsIE0gXFwsIFgiXSxbMCwwLCJNXFwsIFgiXSxbMCwyLCJNIFxcLCBZIl0sWzMsMiwiTVxcLCBNXFwsIFkiXSxbNSwwLCJNXFwsIFgiXSxbNSwyLCJNIFxcLCBZIl0sWzgsMCwiWCJdLFs4LDIsIlkiXSxbMSwyLCJNZiJdLFswLDMsIk0gKE0gZikiXSxbMSwwLCJcXGRlbHRhX1giXSxbMiwzLCJcXGRlbHRhX1kiXSxbNCw1LCJNXFwsIGYiXSxbNCw2LCJcXHZhcmVwc2lsb25fWCJdLFs1LDcsIlxcdmFyZXBzaWxvbl9ZIl0sWzYsNywiZiJdXQ==
- https://q.uiver.app/#q=WzAsOCxbMCwwLCJNXFwsIFgiXSxbMiwwLCJNXFwsIE1cXCwgWCJdLFswLDIsIk1cXCwgTVxcLCBYIl0sWzIsMiwiTSBcXCwgTSBcXCwgTVxcLCBYIl0sWzQsMCwiTSBcXCwgWCJdLFs2LDAsIk0gXFwsIE0gXFwsIFgiXSxbNCwyLCJNXFwsIE1cXCwgWCJdLFs2LDIsIk0gXFwsIFgiXSxbMCwyLCJcXGRlbHRhX1giLDJdLFswLDEsIlxcZGVsdGFfWCJdLFsxLDMsIlxcZGVsdGFfe00gWH0iXSxbMiwzLCJNIFxcLCBcXGRlbHRhX1giLDJdLFs0LDUsIlxcZGVsdGFfe1h9Il0sWzQsNiwiXFxkZWx0YV9YIl0sWzYsNywiTVxcLCBcXHZhcmVwc2lsb25fWCJdLFs1LDcsIlxcdmFyZXBzaWxvbl97TVh9Il0sWzQsNywiXFx0ZXh0cm17aWR9IiwxXV0=
- https://q.uiver.app/#q=WzAsNCxbMCwwLCJNIFggXFx0aW1lcyBYIl0sWzIsMCwiTSBYIl0sWzAsMiwiTSBZIFxcdGltZXMgWSAiXSxbMiwyLCJNIFkgIl0sWzAsMSwiXFxtYXRodHR7cHV0fSIsMV0sWzAsMiwiKE0gZikgXFx0aW1lcyBmIiwxXSxbMiwzLCJcXG1hdGh0dHtwdXR9IiwxXSxbMSwzLCJNIGYiLDFdXQ==
- https://q.uiver.app/#q=WzAsNyxbMCwwLCJTIl0sWzIsMCwiV1cgUyJdLFswLDIsIldTIl0sWzIsMiwiV1cgUyJdLFszLDAsIlMiXSxbNSwwLCJXIFMgIl0sWzUsMiwiUyAiXSxbMCwxLCJcXGJldGEiLDFdLFswLDIsIlxcYmV0YSIsMV0sWzEsMywiVyBcXGJldGEiLDFdLFsyLDMsIlxcZGVsdGEiLDFdLFs0LDUsIlxcYmV0YSIsMV0sWzUsNiwiXFx2YXJlcHNpbG9uIiwxXSxbNCw2LCJpZCIsMV1d
- https://q.uiver.app/#q=WzAsNSxbMCwxLCJNIFMiXSxbMiwyLCJTIl0sWzQsMSwiVyBTIl0sWzEsMCwiTSBXIFMiXSxbMywwLCJXIE0gUyJdLFswLDEsIlxcYWxwaGEiLDFdLFsxLDIsIlxcYmV0YSIsMV0sWzAsMywiTSBcXGJldGEiLDFdLFs0LDIsIk0gXFxhbHBoYSIsMV0sWzMsNCwiXFxnYW1tYSIsMV1d
- https://q.uiver.app/#q=WzAsNSxbMCwxLCJNIE0gWCJdLFsyLDIsIk0gWCJdLFs0LDEsIk0gTSBYIl0sWzEsMCwiTSBNIE0gWCJdLFszLDAsIk0gTSBNIFgiXSxbMCwxLCJcXG11IiwxXSxbMSwyLCJcXGRlbHRhIiwxXSxbMCwzLCJNIFxcZGVsdGEiLDFdLFs0LDIsIk0gXFxtdSIsMV0sWzMsNCwiXFxnYW1tYSIsMV1d
- https://q.uiver.app/#q=WzAsNCxbMCwwLCJNIFgiXSxbMiwwLCIoWFxcUmlnaHRhcnJvdyBYKSBcXHRpbWVzIE0gWCJdLFs0LDAsIk0gKCAoWCBcXFJpZ2h0YXJyb3cgWCkgXFx0aW1lcyBYKSAiXSxbNCwyLCJNIFgiXSxbMCwzLCJpZCIsMV0sWzAsMSwiXFxsYW5nbGUgXFxtYXRodHR7Y29uc3Rfe2lkfX0sIGlkXFxyYW5nbGUiXSxbMSwyLCJcXG1hdGh0dHtzdHJlbmd0aH0iXSxbMiwzLCJNICgoZix4KSBcXG1hcHN0byBmIHgpIiwxXV0=
- https://github.com/ravst/MonadsComonadsTransducersCoq
- https://q.uiver.app/#q=WzAsOCxbMCwwLCJNXFwsIFgiXSxbMywwLCJNXFwsIE1cXCwgWCJdLFswLDIsIk1cXCwgTVxcLCBYIl0sWzMsMiwiTSBcXCwgTSBcXCwgTVxcLCBYIl0sWzUsMCwiTSBcXCwgWCJdLFs3LDAsIk0gXFwsIE0gXFwsIFgiXSxbNSwyLCJNXFwsIE1cXCwgWCJdLFs3LDIsIk0gXFwsIFgiXSxbMCwyLCJcXGRlbHRhX1giLDJdLFswLDEsIlxcZGVsdGFfWCJdLFsxLDMsIlxcZGVsdGFfe00gWH0iXSxbMiwzLCJNIFxcLCBcXGRlbHRhX1giLDJdLFs0LDUsIlxcZGVsdGFfe1h9Il0sWzQsNiwiXFxkZWx0YV9YIl0sWzYsNywiTVxcLCBcXHZhcmVwc2lsb25fWCJdLFs1LDcsIlxcdmFyZXBzaWxvbl97TVh9Il0sWzQsNywiXFx0ZXh0cm17aWR9IiwxXV0=