{"guid":"aef73580-5ac6-437f-bf3e-7780af9123e7","title":"Going back in time with the Undoable Monad","subtitle":null,"slug":"bob11-2026-undoable-monad-elliot","link":"https://bobkonf.de/2026/paul-elliot.html","description":"Slipshow is a presentation tool. One of its specificity is that it is\n          not based on slides, but on an infinite canvas on which you can zoom\n          or scroll. Yet, compared to Prezi, the source of a presentation is\n          text.\n          \n          The way the author defines the dynamic of its presentation is by\n          intertwining actions in its textual content. Slipshow allows many\n          actions, such as revealing new content, scrolling or zooming, starting\n          an animation, or even starting a script defined by the user. This\n          gives the author freedom in how they want to present.\n          \n          However, for Slipshow itself, this is a programming challenge: How to\n          allow to go back in your presentation's steps? How to organize the\n          code so that it's not restricting to adding new actions, and that it's\n          easy to maintain?\n          \n          Originally written in JavaScript, Slipshow has suffered from bad\n          design in this space. However, since its rewrite in OCaml, the\n          opportunity to tackle this problem has been taken, with great success\n          and much more stability, using the Undoable Monad.\n          \n          Monads are a way to embed a \"computing\" DSL in a programming\n          language. They allow to define a \"variant\" of computation (for\n          instance \"concurrent programming\") and let the user program in that\n          new way, almost transparently.\n          \n          The Undoable Monad provides an excellent example of monad: it is\n          simple enough, yet solves a real problem in an elegant way. This talk\n          is a fun and practical introduction to monadic programming.\n\nLicensed to the public under https://creativecommons.org/licenses/by/3.0/de","original_language":"eng","persons":["Paul-Elliot"],"view_count":4,"promoted":false,"date":"2026-03-13T11:05:00.000+01:00","release_date":"2026-05-19T00:00:00.000+02:00","updated_at":"2026-05-19T23:45:04.259+02:00","tags":["3","2026","bob2026","Talk","Talks #1","bob2026-eng","BOB","BOB Konferenz","Day 1"],"length":2543,"duration":2543,"thumb_url":"https://static.media.ccc.de/media/events/bobkonf/2026/3-aef73580-5ac6-437f-bf3e-7780af9123e7.jpg","poster_url":"https://static.media.ccc.de/media/events/bobkonf/2026/3-aef73580-5ac6-437f-bf3e-7780af9123e7_preview.jpg","timeline_url":"https://static.media.ccc.de/media/events/bobkonf/2026/3-aef73580-5ac6-437f-bf3e-7780af9123e7.timeline.jpg","thumbnails_url":"https://static.media.ccc.de/media/events/bobkonf/2026/3-aef73580-5ac6-437f-bf3e-7780af9123e7.thumbnails.vtt","frontend_link":"https://media.ccc.de/v/bob11-2026-undoable-monad-elliot","url":"https://api.media.ccc.de/public/events/aef73580-5ac6-437f-bf3e-7780af9123e7","conference_title":"BOB Konferenz 2026","conference_url":"https://api.media.ccc.de/public/conferences/bobkonf2026","related":[],"recordings":[{"size":204,"length":2543,"mime_type":"video/webm","language":"eng","filename":"bob2026-3-eng-Going_back_in_time_with_the_Undoable_Monad_webm-hd.webm","state":"new","folder":"webm-hd","high_quality":true,"width":2560,"height":1440,"updated_at":"2026-05-19T19:52:00.019+02:00","recording_url":"https://cdn.media.ccc.de/events/bobkonf/2026/webm-hd/bob2026-3-eng-Going_back_in_time_with_the_Undoable_Monad_webm-hd.webm","url":"https://api.media.ccc.de/public/recordings/100694","event_url":"https://api.media.ccc.de/public/events/aef73580-5ac6-437f-bf3e-7780af9123e7","conference_url":"https://api.media.ccc.de/public/conferences/bobkonf2026"},{"size":81,"length":2543,"mime_type":"video/webm","language":"eng","filename":"bob2026-3-eng-Going_back_in_time_with_the_Undoable_Monad_webm-sd.webm","state":"new","folder":"webm-sd","high_quality":false,"width":720,"height":576,"updated_at":"2026-05-19T19:41:22.061+02:00","recording_url":"https://cdn.media.ccc.de/events/bobkonf/2026/webm-sd/bob2026-3-eng-Going_back_in_time_with_the_Undoable_Monad_webm-sd.webm","url":"https://api.media.ccc.de/public/recordings/100689","event_url":"https://api.media.ccc.de/public/events/aef73580-5ac6-437f-bf3e-7780af9123e7","conference_url":"https://api.media.ccc.de/public/conferences/bobkonf2026"},{"size":38,"length":2543,"mime_type":"audio/mpeg","language":"eng","filename":"bob2026-3-eng-Going_back_in_time_with_the_Undoable_Monad_mp3.mp3","state":"new","folder":"mp3","high_quality":false,"width":0,"height":0,"updated_at":"2026-05-19T19:20:07.775+02:00","recording_url":"https://cdn.media.ccc.de/events/bobkonf/2026/mp3/bob2026-3-eng-Going_back_in_time_with_the_Undoable_Monad_mp3.mp3","url":"https://api.media.ccc.de/public/recordings/100682","event_url":"https://api.media.ccc.de/public/events/aef73580-5ac6-437f-bf3e-7780af9123e7","conference_url":"https://api.media.ccc.de/public/conferences/bobkonf2026"},{"size":27,"length":2543,"mime_type":"audio/opus","language":"eng","filename":"bob2026-3-eng-Going_back_in_time_with_the_Undoable_Monad_opus.opus","state":"new","folder":"opus","high_quality":false,"width":0,"height":0,"updated_at":"2026-05-19T19:20:03.757+02:00","recording_url":"https://cdn.media.ccc.de/events/bobkonf/2026/opus/bob2026-3-eng-Going_back_in_time_with_the_Undoable_Monad_opus.opus","url":"https://api.media.ccc.de/public/recordings/100681","event_url":"https://api.media.ccc.de/public/events/aef73580-5ac6-437f-bf3e-7780af9123e7","conference_url":"https://api.media.ccc.de/public/conferences/bobkonf2026"},{"size":58,"length":2543,"mime_type":"video/mp4","language":"eng","filename":"bob2026-3-eng-Going_back_in_time_with_the_Undoable_Monad_sd.mp4","state":"new","folder":"h264-sd","high_quality":false,"width":720,"height":576,"updated_at":"2026-05-19T19:13:53.182+02:00","recording_url":"https://cdn.media.ccc.de/events/bobkonf/2026/h264-sd/bob2026-3-eng-Going_back_in_time_with_the_Undoable_Monad_sd.mp4","url":"https://api.media.ccc.de/public/recordings/100678","event_url":"https://api.media.ccc.de/public/events/aef73580-5ac6-437f-bf3e-7780af9123e7","conference_url":"https://api.media.ccc.de/public/conferences/bobkonf2026"},{"size":139,"length":2543,"mime_type":"video/mp4","language":"eng","filename":"bob2026-3-eng-Going_back_in_time_with_the_Undoable_Monad_hd.mp4","state":"new","folder":"h264-hd","high_quality":true,"width":2560,"height":1440,"updated_at":"2026-05-19T18:38:45.208+02:00","recording_url":"https://cdn.media.ccc.de/events/bobkonf/2026/h264-hd/bob2026-3-eng-Going_back_in_time_with_the_Undoable_Monad_hd.mp4","url":"https://api.media.ccc.de/public/recordings/100665","event_url":"https://api.media.ccc.de/public/events/aef73580-5ac6-437f-bf3e-7780af9123e7","conference_url":"https://api.media.ccc.de/public/conferences/bobkonf2026"}]}