Capire Monadi, Comonadi e Trasduttori nella Programmazione
Impara i concetti chiave della programmazione per gestire meglio i dati e la gestione degli errori.
― 5 leggere min
Indice
- Cosa sono le Monadi?
- Componenti Base delle Monadi
- Cosa sono le Comonadi?
- Componenti Base delle Comonadi
- Cosa sono i Trasduttori?
- Il Ruolo dei Trasduttori
- Come si Relazionano Monadi, Comonadi e Trasduttori?
- Esempi nella Programmazione
- Applicazioni Pratiche
- Elaborazione dei Dati
- Gestione degli Errori
- Calcoli con Stato
- Conclusione
- Fonte originale
- Link di riferimento
Nel campo dell'informatica, specialmente nei linguaggi di programmazione e aree correlate, capire certi concetti può migliorare tantissimo il modo in cui progettiamo e implementiamo algoritmi. Tra questi concetti ci sono Monadi, comonadi e Trasduttori. Questi termini potrebbero sembrare complessi, ma hanno applicazioni pratiche nella programmazione e aiutano a semplificare problemi complicati.
Questo articolo spiegherà cosa sono monadi, comonadi e trasduttori, come si relazionano tra loro e i loro usi nella programmazione. Daremo anche un'occhiata a esempi per chiarire queste idee.
Cosa sono le Monadi?
Le monadi sono un modo per strutturare i programmi. Ci permettono di concatenare operazioni in modo pulito e gestibile. Pensiamo a una monade come a uno strumento che aiuta a gestire gli effetti collaterali nella programmazione, come la gestione degli stati, l'input/output (I/O) o gli errori, senza affollare la logica principale.
Componenti Base delle Monadi
Una monade è composta da tre componenti principali:
- Tipo: Questo definisce che tipo di dati gestisce la monade.
- Funzione Unit: Questa prende un valore normale e lo incapsula nella monade.
- Funzione Bind: Questa prende una monade e una funzione, applica la funzione al valore dentro la monade e restituisce una nuova monade.
Questi componenti permettono di concatenare operazioni. Ad esempio, se hai una monade che rappresenta un valore che potrebbe fallire, puoi concatenare operazioni in modo che se una operazione fallisce, le altre non vengano eseguite.
Cosa sono le Comonadi?
Le comonadi possono essere considerate il duale delle monadi. Mentre le monadi costruiscono valori, le comonadi aiutano a estrarre o analizzare valori. Sono utili quando il contesto attorno a un valore è importante.
Componenti Base delle Comonadi
Simile alle monadi, anche le comonadi hanno tre componenti principali:
- Tipo: Definisce i dati con cui lavora la comonade.
- Funzione Extract: Questa recupera il valore da una comonade.
- Funzione Extend: Questa applica una funzione alla comonade e restituisce una nuova comonade che contiene informazioni aggiuntive.
Le comonadi sono particolarmente utili in situazioni dove dobbiamo portare contesto o tenere traccia di informazioni aggiuntive mentre elaboriamo i dati.
Cosa sono i Trasduttori?
I trasduttori sono un concetto più complesso che può essere inteso come trasformazioni tra Tipi di dati. Funzionano prendendo un input, elaborandolo e producendo un output, spesso mantenendo una certa forma di struttura.
Il Ruolo dei Trasduttori
I trasduttori possono gestire molti tipi di dati, trasformandoli da una forma all'altra. Ad esempio, possono convertire un elenco di numeri nei loro valori quadrati o cambiare il formato dei dati testuali.
I trasduttori sono spesso costruiti usando monadi e comonadi, sfruttando le loro caratteristiche per gestire in modo efficace l'input e l'output.
Come si Relazionano Monadi, Comonadi e Trasduttori?
Monadi, comonadi e trasduttori possono lavorare insieme senza problemi. In particolare, i trasduttori spesso utilizzano monadi per gestire i valori e comonadi per estrarre contesto. Questo intreccio consente una gestione robusta delle trasformazioni dei dati mantenendo chiarezza.
Esempi nella Programmazione
Ecco alcuni esempi di come questi concetti possono essere applicati nella programmazione.
Monadi: In linguaggi di programmazione funzionale come Haskell, la monade Maybe può essere usata per gestire operazioni che potrebbero fallire. Ad esempio, se provi a recuperare un valore da una lista, potresti ottenere Nothing se la lista è vuota, garantendo una gestione degli errori pulita.
Comonadi: In alcune applicazioni, come la programmazione reattiva funzionale, le comonadi possono essere usate per gestire calcoli con stato. Permettono ai programmatori di estrarre valori in modo sensibile al contesto, rendendo più facile costruire applicazioni interattive.
Trasduttori: Librerie in vari linguaggi di programmazione consentono trasformazioni di dati semplici. Ad esempio, un trasduttore potrebbe prendere una raccolta di dati, applicare un filtro e trasformare i dati tutto in una volta senza passaggi intermedi.
Applicazioni Pratiche
Elaborazione dei Dati
Una delle applicazioni più comuni delle monadi è nelle pipeline di elaborazione dei dati. I programmatori possono costruire una serie di trasformazioni che rappresentano il flusso dei dati da una fase all'altra. Questo approccio aiuta a semplificare operazioni complesse suddividendole in pezzi più piccoli e gestibili.
Gestione degli Errori
Le monadi forniscono un modo per gestire gli errori in modo elegante. Invece di controllare gli errori ad ogni passo di calcolo, la struttura della monade consente una gestione centralizzata degli errori. Ad esempio, in un'app web, una monade potrebbe incapsulare le risposte per garantire che se un'operazione incontra un errore, le altre operazioni vengano saltate in sicurezza.
Calcoli con Stato
Le comonadi sono particolarmente potenti nella gestione di calcoli con stato. In applicazioni come giochi o simulazioni, dove lo stato cambia nel tempo, le comonadi consentono di gestire questa complessità mantenendo il contesto rilevante durante i calcoli.
Conclusione
Monadi, comonadi e trasduttori sono concetti potenti che possono semplificare i compiti di programmazione. Offrono approcci strutturati alla gestione delle trasformazioni dei dati, alla gestione degli stati e alla gestione degli errori. Capendo questi concetti, i programmatori possono scrivere codice più pulito e manutenibile e costruire applicazioni robuste.
Questo articolo ha cercato di demistificare questi argomenti e fornire una base per considerare come potrebbero essere applicati praticamente. Che tu sia nuovo nella programmazione o un sviluppatore esperto, incorporare queste idee nel tuo lavoro può arricchire il tuo toolkit per risolvere problemi.
Titolo: Monads, Comonads, and Transducers
Estratto: 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.
Autori: Rafał Stefański
Ultimo aggiornamento: 2024-07-02 00:00:00
Lingua: English
URL di origine: https://arxiv.org/abs/2407.02704
Fonte PDF: https://arxiv.org/pdf/2407.02704
Licenza: https://creativecommons.org/licenses/by/4.0/
Modifiche: Questa sintesi è stata creata con l'assistenza di AI e potrebbe presentare delle imprecisioni. Per informazioni accurate, consultare i documenti originali collegati qui.
Si ringrazia arxiv per l'utilizzo della sua interoperabilità ad accesso aperto.
Link di riferimento
- 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=