Something went wrong. Try again.
ssg
Something went wrong. Try again.
12<!DOCTYPE HTML><html lang="en" data-theme="light"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>nde: effect-system</title><link rel="stylesheet" href="../styles/reset.css"><link rel="stylesheet" href="../styles/prima.css"></head><body class="node-page"><main class="main-content"><h1>node: effect-system</h1><div><h1><a href="../f/effect-kleisli.html">Effect is Kleisli, Etymologically</a></h1><div class="metadata"><span class="date">2025-11-26</span><span class="ndes"><a href="../n/effect-system.html">effect-system</a>, <a href="../n/haskell.html">haskell</a>, <a href="../n/monad.html">monad</a>, <a href="../n/2025.html">2025</a></span></div><div class="description">It's pretty intriguing that the Effect type in this blog is exactly the traditional Kleisli type in haskell. We'll further show that Monad is the constraint we need to form the valid Effect category. If you are wondering about the meaning of effects in the haskell world, I believe this blog will help gain some understanding.</div></div></main><nav class="bottom-nav"><a href="../index.html">⌂</a><a href="../feed.xml">⌗</a><a href="../license">©</a><a href="#" id="theme-toggle" title="toggle theme">◐</a></nav><script>MathJax = { loader: { load: ['ui/lazy'] }, options: { skipHtmlTags: ['script','noscript','style','textarea','pre'], lazyMargin: '300px', renderActions: { find: [10, function(doc) { for (const node of document.querySelectorAll('.math-block')) { const math = new doc.options.MathItem( node.textContent, doc.inputJax[0], true ); const text = document.createTextNode(''); node.parentNode.replaceChild(text, node); math.start = {node: text, delim: '', n: 0}; math.end = {node: text, delim: '', n: 0}; doc.math.push(math); } for (const node of document.querySelectorAll('.inlinemath')) { const math = new doc.options.MathItem( node.textContent, doc.inputJax[0], false ); const text = document.createTextNode(''); node.parentNode.replaceChild(text, node); math.start = {node: text, delim: '', n: 0}; math.end = {node: text, delim: '', n: 0}; doc.math.push(math); } }, ''] } }, tex: { inlineMath: [], displayMath: [], packages: {'[+]': ['ams', 'boldsymbol']} }, svg: { fontCache: 'global' }};</script><script src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js" defer=""></script><script>document.addEventListener('DOMContentLoaded', function() { var themeToggle = document.getElementById('theme-toggle'); var html = document.documentElement; var savedTheme = localStorage.getItem('theme') || 'light'; html.setAttribute('data-theme', savedTheme); if (!themeToggle) return; themeToggle.addEventListener('click', function(e) { e.preventDefault(); var currentTheme = html.getAttribute('data-theme'); var newTheme = currentTheme === 'light' ? 'dark' : 'light'; html.setAttribute('data-theme', newTheme); localStorage.setItem('theme', newTheme); });});</script><script>document.addEventListener('DOMContentLoaded', function() { var nav = document.querySelector('.bottom-nav'); if (!nav) return; var thr = 32; function upd() { var y = window.scrollY || document.documentElement.scrollTop; var max = document.documentElement.scrollHeight - window.innerHeight; var sht = max < thr ? y > 0 : y >= thr; nav.classList.toggle('is-visible', sht); } window.addEventListener('scroll', upd, { passive: true }); upd();});</script></body></html>