[{"data":1,"prerenderedAt":195},["ShallowReactive",2],{"navigation":3,"talk-/talks/monads":146,"person-Willow Sparks":180,"/talks/monads-surround":190},[4],{"title":5,"path":6,"stem":7,"children":8,"page":145},"Talks","/talks","talks",[9,13,17,21,25,29,33,37,41,45,49,53,57,61,65,69,73,77,81,85,89,93,97,101,105,109,113,117,121,125,129,133,137,141],{"title":10,"path":11,"stem":12},"The Single Responsibility Principle","/talks/single-responsibility-principle","talks/single-responsibility-principle",{"title":14,"path":15,"stem":16},"The Open/Closed Principle","/talks/open-closed-principle","talks/open-closed-principle",{"title":18,"path":19,"stem":20},"Spack","/talks/spack","talks/spack",{"title":22,"path":23,"stem":24},"GitHub Actions","/talks/github-actions","talks/github-actions",{"title":26,"path":27,"stem":28},"Inheritance is Evil","/talks/inheritance-is-evil","talks/inheritance-is-evil",{"title":30,"path":31,"stem":32},"Nuxt","/talks/nuxt","talks/nuxt",{"title":34,"path":35,"stem":36},"LogSeq","/talks/logseq","talks/logseq",{"title":38,"path":39,"stem":40},"Time Complexity","/talks/time-complexity","talks/time-complexity",{"title":42,"path":43,"stem":44},"How to Review a Codebase","/talks/how-to-review-a-codebase","talks/how-to-review-a-codebase",{"title":46,"path":47,"stem":48},"Numba and Bitmasks","/talks/numba-and-bitmasks","talks/numba-and-bitmasks",{"title":50,"path":51,"stem":52},"Mutation Testing","/talks/mutation-testing","talks/mutation-testing",{"title":54,"path":55,"stem":56},"Message Passing Interface","/talks/message-passing-interface","talks/message-passing-interface",{"title":58,"path":59,"stem":60},"P vs NP","/talks/p-vs-np","talks/p-vs-np",{"title":62,"path":63,"stem":64},"Verbose Graphics with Rust and Vulkan","/talks/verbose-graphics-with-rust-and-vulkan","talks/verbose-graphics-with-rust-and-vulkan",{"title":66,"path":67,"stem":68},"Slidev","/talks/slidev","talks/slidev",{"title":70,"path":71,"stem":72},"Nuxt Content By Example","/talks/nuxt-content-by-example","talks/nuxt-content-by-example",{"title":74,"path":75,"stem":76},"Rust MMU Guest Lecture","/talks/rust-mmu-guest-lecture","talks/rust-mmu-guest-lecture",{"title":78,"path":79,"stem":80},"As We May Think - AI for Coding","/talks/ai-for-coding","talks/ai-for-coding",{"title":82,"path":83,"stem":84},"Git in Practice: Techniques for Collaborative Development","/talks/git-in-practice","talks/git-in-practice",{"title":86,"path":87,"stem":88},"A Crash Course in Natural Language Processing","/talks/natural-language-processing","talks/natural-language-processing",{"title":90,"path":91,"stem":92},"Graphs: Ruining the Travelling Salesman's Day Since 1930","/talks/graph-theory","talks/graph-theory",{"title":94,"path":95,"stem":96},"Automating File Creation With Jinja2 Templates in Python","/talks/jinja2-templates-with-python","talks/jinja2-templates-with-python",{"title":98,"path":99,"stem":100},"What the hell is a Monad?","/talks/monads","talks/monads",{"title":102,"path":103,"stem":104},"The Liskov Substitution Principle","/talks/liskov-substitution-principle","talks/liskov-substitution-principle",{"title":106,"path":107,"stem":108},"Everything as a Specification","/talks/everything-as-a-specification","talks/everything-as-a-specification",{"title":110,"path":111,"stem":112},"The Interface Segregation Principle","/talks/interface-segregation-principle","talks/interface-segregation-principle",{"title":114,"path":115,"stem":116},"The Dependency Inversion Principle","/talks/dependency-inversion-principle","talks/dependency-inversion-principle",{"title":118,"path":119,"stem":120},"A Field Guide To Coupling","/talks/a-field-guide-to-coupling","talks/a-field-guide-to-coupling",{"title":122,"path":123,"stem":124},"Why Python is (and isn't) Fast","/talks/why-python-is-slow","talks/why-python-is-slow",{"title":126,"path":127,"stem":128},"Cybersecurity","/talks/cybersecurity","talks/cybersecurity",{"title":130,"path":131,"stem":132},"What Linux Distribution Should You Use?","/talks/what-linux-distribution","talks/what-linux-distribution",{"title":134,"path":135,"stem":136},"Agent Communication Protocols","/talks/agent-communication-protocols","talks/agent-communication-protocols",{"title":138,"path":139,"stem":140},"Why I hate try/catch, and why you should hate it too!","/talks/hate-try-catch","talks/hate-try-catch",{"title":142,"path":143,"stem":144},"The Beauty of Vim Motions","/talks/beauty-of-vim-motions","talks/beauty-of-vim-motions",false,{"id":147,"title":98,"body":148,"date":170,"description":154,"extension":171,"imgClass":172,"imgUrl":173,"isImgLogo":145,"meta":174,"navigation":175,"path":99,"recordingUrl":176,"seo":177,"speaker":178,"stem":100,"__hash__":179},"talks/talks/monads.md",{"type":149,"value":150,"toc":165},"minimark",[151,155,158,161],[152,153,154],"p",{},"Monads are one of the most powerful tools in functional programming languages, yet widely misunderstood as an unexplainable and over-abstracted whimsy only describable as \"monoids in the category of endofunctors.\"",[152,156,157],{},"In my talk, I will endeavour to explain that monads are fundamentally just boxes you can put things in. We will draw parallels between other abstractions like classes, but we will also look at what other capabilities they have.",[152,159,160],{},"By the end I hope to have either brought a newfound appreciation for the mathematical beauty of haskell, or a fundamental revulsion at the mind of mathematicians. Just as long as you get what a monad is, that's ok.",[162,163],"slidev",{"name":164},"monads",{"title":166,"searchDepth":167,"depth":168,"links":169},"",1,2,[],["Date","2026-04-01T00:00:00.000Z"],"md",null,"/images/monads.png",{},true,"https://stfc365-my.sharepoint.com/personal/ashraf_hussain_stfc_ac_uk/_layouts/15/embed.aspx?UniqueId=7ac2677e-f0fd-44a3-85b0-cd25815151d1&embed=%7B%22ust%22%3Atrue%2C%22hv%22%3A%22CopyEmbedCode%22%7D&referrer=StreamWebApp&referrerScenario=EmbedDialog.Create",{"title":98,"description":154},"Willow Sparks","MyXxGpn9yVZe77R_RACgANAbfRE_GnYCsKQ7wfPnnT4",{"id":181,"title":182,"extension":183,"imgUrl":184,"meta":185,"name":178,"roles":186,"stem":188,"__hash__":189},"people/people/willow-sparks.yml","Graduate Software Engineer","yml","/images/people/willow-sparks.jpg",{},[187],"Committee Member","people/willow-sparks","fjs2l6kUY59lq2f81sCpTNM1Z_lM8WUfcYyyF_HNpaI",[191,193],{"title":94,"path":95,"stem":96,"description":192,"children":-1},"Learn how Jinja2 provides a lightweight and simple templating infrastructure in Python to help you automate the creation of ordered, structured text files",{"title":102,"path":103,"stem":104,"description":194,"children":-1},"A talk on the Liskov Substitution Principle, the third of the SOLID principles. Covers what types really are, how to extend them correctly, and the real-world consequences of breaking substitutability.",1778147361191]