RSSAmplifier

Blog

Chris Done's Blog

Blog all about programming, especially in Haskell since 2008!

chrisdone.comRSS feed ↗123 posts

Latest posts

Lisp compilers that compile directly to assembly

Lisp compilers that compile directly to assembly Lisp compilers that compile directly to assembly Note: An LLM was not used in writing this article. I’d like to point out one cool thing that some Lisp compilers, like SBCL, do. SBCL compiles functions and expressions directly to assembly. There aren’t other AST interpreter or byte-code interpreter modes, as seen in many other languages. Let’s turn…

Talks

Talks Talks Note: An LLM was not used in writing this article. Here’s a list of talks that I like, that I keep coming back to over the years, especially ones that have strongly influenced my thinking or changed my mind on something. Computing “We Really Don’t Know How to Compute!” by Gerald Sussman, 2011 “Performance Matters” by Emery Berger, 2019 “Simple Made Easy” by Rich Hickey, 2011…

Meta

Meta Meta Note: An LLM was not used in writing this article. Commentary and updates about my blog, its software, features, etc. I added a “microblog” feature to my blog. It lets me use the form feed character in a post to split it up into a series of sub posts, which have independent pages. It’s a nice way to organise updates to a topic and avoid them necessarily hitting my main RSS feed. Examples…

Blogs

Blogs Blogs Note: An LLM was not used in writing this article. A list of blogs I like. I’ll add to this from time to time. Proper blogs Small, quirky, intimate. Proper blogs. http://static.v25media.com/edw519_mod.html https://lr0.org/blog/ https://ratfactor.com/ https://caolan.uk/ Big blogs Big, well known, somewhat performative. Post-blogging blogs. https://danluu.com/ https://prog21.dadgum.com/…

System Colic

System Colic System Colic Note: An LLM was not used in writing this article. Colic is a thing that some newborn babies go through. Your newborn baby cries for hours on end, every day, for weeks. And they’re by all measures healthy. Experts don’t know what causes it and they don’t have any remedies for it. As a parent, you and your partner pretty much lose your marbles and start questioning all…

Home fibre

Home fibre Home fibre Note: An LLM was not used in writing this article. When a Cat6 cable does the job, but I want fibre optic anyway Table of Contents Why Things I learned Components The fibre optic patch cable Side B Side A Computer side The final result Whole setup The FS media converter in action TP-link media converter in action Pictures of the parts SC-APC test patch cable FS media…

Some updates about Hell in 2026

Some updates about Hell in 2026 Some updates about Hell in 2026 Note: An LLM was not used in writing this article. I’ve added a few neat bits and bobs to Hell since I last blogged about it. On the API side, things have slowed down when compared with the prior year, 1 but other improvements were still made. Sum types I’ve added support for using case statements on built-in primitive types, like…

Proposal to extend JSON with sum types (variants)

Proposal to extend JSON with sum types (variants) Proposal to extend JSON with sum types (variants) Note: An LLM was not used in writing this article. A small syntactical addition that I propose to add to JSON is variants. It looks like this: # "succeeded" # "failed" ( "Problem flerbing the fobnicator." ) # "loading" ({ "remaining" : 3 , "completed" : 7 }) [ # "foo" , # "bar" ( 1 ), # "boz" (…

Laws

Laws Laws Note: An LLM was not used in writing this article. Laws that apply to our industry (and others) are interesting to me, and I’m writing up here the ones that often come to mind. I usually forget the name, so writing them up might be helpful for remembering in future. Brooks’s law Adding manpower to a late software project makes it later. Ramp-up time, increased communication overhead are…

Argumentum ad colossum

Argumentum ad colossum Argumentum ad colossum Note: An LLM was not used in writing this article. I’m coining a new phrase to use for discussion purposes: argumentum ad colossum . It’s very difficult to replicate what worked for one company at another company, because culture is hard to transfer. This has been argued in business literature, e.g. Google’s OKRs and silly interviews, Amazon’s…

Applicative-wired monad pattern

Applicative-wired monad pattern Applicative-wired monad pattern Note: An LLM was not used in writing this article. In Haskell API design, you sometimes want to model a computation that looks like a monad, i.e. some things depend on other things, and make use of do-notation, but you want to be able to statically inspect the resulting structure, too. The ApplicativeDo notation attempts to bridge…

My blog now runs on a Raspberry Pi at home

My blog now runs on a Raspberry Pi at home My blog now runs on a Raspberry Pi at home Note: An LLM was not used in writing this article. A mini microblog on Raspberry Pi at home. 2025-05-09 I discovered that my new house had OFNL internet, which is one of a handful competing fibre providers in England (others: BT OpenReach, VirginMedia, Hyperoptic, etc). Some of the infra providers are also the…

LLMs

LLMs LLMs Note: An LLM was not used in writing this article. This page serves as my place to journal what are hopefully balanced thoughts on the current AI summer, driven by LLMs. 2026-07-03 I enjoyed these quotes by Jaron Lanier on the topic of AI : “A lot of modern enlightenment thinkers and technical people feel that there is something old-fashioned about believing that people are special – for…

The LLM Curse

The LLM Curse The LLM Curse Note: An LLM was not used in writing this article. I encountered a package, and 99.9% of the Haskell code of that package was–proudly!–written using Claude. I took a browse through the code. Something that came to mind was The Lisp Curse: Broadly speaking, the Lisp curse is that syntactic abstraction, and extension of the language, is so powerful that Lisp programmers…

Less-Than Estimation

Less-Than Estimation Less-Than Estimation Note: An LLM was not used in writing this article. Mechanics A method of estimation I’ve used successfully on a bunch of projects over the years goes like this. Estimations are one of four choices: <hour <day <week <month I call it “less than estimation” because if a given piece of work is obviously under an hour, your estimate is <hour . If it’s not…

Registers of code authoring

Registers of code authoring Registers of code authoring Note: An LLM was not used in writing this article. I’ve recently been thinking about the fact that there are very distinct registers (for lack of a better word) of authoring code, for me, depending on the type of project. Work codebases: in my experience over a couple decades, are of medium standard; we do our best with expedience coming…

Hell (Haskell shell): Year in Review

Hell (Haskell shell): Year in Review Hell (Haskell shell): Year in Review Note: An LLM was not used in writing this article. Hell is my little shell scripting language which is a thin layer 1 over Haskell, using its syntax, its standard library and runtime, with a simpler static type system. You can find examples here . Over the year of 2024, I’ve written a few non-trivial shell scripts in Hell at…

Adding sum types (variants) to Hell

Adding sum types (variants) to Hell Adding sum types (variants) to Hell Note: An LLM was not used in writing this article. Hell is my little shell scripting language that’s a thin layer over Haskell’s own standard library and runtime. This post is for people that like language implementation details. It has a simply typed system, without polytypes (no forall ). It has classic Haskell 98-ish…

A modest critique of Htmx

A modest critique of Htmx A modest critique of Htmx Note: An LLM was not used in writing this article. At work, we really like the basic simple idea of Htmx. Based on using Htmx in a non-trivial user interface, across a team, we’ve found that the following cases are actually not simple and are quite complicated. Inheritance of Htmx properties is a definite mistake Across pieces of code, it’s very…

Naming sum types is often hard

Naming sum types is often hard Naming sum types is often hard Note: An LLM was not used in writing this article. After doing quite a lot of software design in systems which encourage use of enumeration types, I’ve noticed that there’s a common challenge in naming both the type and the cases of the type. It usually exposes a painful inadequacy in the English language and my grasp of it, assuming…

Portals in Emacs

Portals in Emacs Portals in Emacs Note: An LLM was not used in writing this article. I’ve been working on a new way to launch and manage processes in Emacs in my personal repo . It’s an alternative to shells. A bit like a notebook. It also partially serves the same need that Prodigy-mode does. The name is evocative of that video game Portal from 2007. It has a major mode, where M-! is rebound to…

All my projects (2008-2023)

All my projects (2008-2023) All my projects (2008-2023) Note: An LLM was not used in writing this article. It might be a “getting old[-er]” thing, but I’ve recently started feeling like documenting the complete set of software projects I’ve worked on that I remember. Not as a CV (an advertisement of paid work), but a comprehensive list of everything . I’m done for now for 2008-2023. I filled out…

Halogen is better than React at everything

Halogen is better than React at everything Halogen is better than React at everything Note: An LLM was not used in writing this article. I wrote these notes in 2022, but found that they still hold up in 2024. Having used TypeScript + React with its hooks in a code base that fully embraces them for more than a year, I return to my original assessment that PureScript + Halogen is better at almost…

Reports of RSS/Atom's death are greatly exaggerated

Reports of RSS/Atom’s death are greatly exaggerated Reports of RSS/Atom’s death are greatly exaggerated Note: An LLM was not used in writing this article. I’m not old, but I remember when people said “my web log.” That then became “blog.” 1 I subscribe via a feed reader 2 to a collection of individual blogs, and a few aggregators (but only the top posts of the week). This strikes a good balance of…

Hell: Shell scripting Haskell dialect

Hell: Shell scripting Haskell dialect Hell: Shell scripting Haskell dialect Note: An LLM was not used in writing this article. Hell is a shell scripting language that is a tiny dialect of Haskell that I wrote for my own shell scripting purposes. As of February, I’m using Hell to generate this blog , instead of Hakyll. 1 Update: As of 3rd Oct 2024, I’m using it on various large (2k line) scripts at…

A spectrum of web dev abstraction

A spectrum of web dev abstraction A spectrum of web dev abstraction Note: An LLM was not used in writing this article. There’s a spectrum of web dev with two sides: Abstraction : blur the lines between client and server, pretend you’re writing an offline desktop app with no server, no latency, no RPC calls, etc. as much as possible. Poster child: React . Non-abstraction : write code like it’s the…

Codebases and love

Codebases and love Codebases and love Note: An LLM was not used in writing this article. Returning to Theory Building (by Peter Naur) , and why rewrites are inevitable (developer/maintainer churn = loss of theory), I have a related thought: In the spirit of “a face only a mother could love”, most (if not all) code-bases larger than a page are inherently unlikeable to anyone but the original…

AI and Machine Thinking

AI and Machine Thinking AI and Machine Thinking Note: An LLM was not used in writing this article. AI might take our jobs. That’s bad for us, just like it was for the Luddites. But I think Herbert had it right when he, through his Dune books, proposed that the problem with “machine minds” is not the machine itself, it’s “machine thinking” which humans are perfectly capable of. Related quotes from…

Pickling: The really obvious missing feature of all web browsers

Pickling: The really obvious missing feature of all web browsers Pickling: The really obvious missing feature of all web browsers Note: An LLM was not used in writing this article. Browsers already provide an excellent delivery mechanism for single page apps. Web apps already have a security model around accessing local files, microphones, webcams, etc. It’s better than anything on macOS, Windows…

Tamagotchi tooling

Tamagotchi tooling Tamagotchi tooling Note: An LLM was not used in writing this article. Remember those tamagotchis that were popular in the early 2000s? Little devices with a screen showing a pet that needed constant maintenance; cleaning, feeding, petting, etc. Some tools are like tamagotchis. They’re a tool, so they have some use. But that’s not all, they also require substantial upkeep to not…

Reasoning violently

Reasoning violently Reasoning violently Note: An LLM was not used in writing this article. The old bash.org joke goes, “XML is like violence, if it doesn’t solve the problem, just use more.” This generalises well. I’ve seen a lot of people choose to continue using tools that are obviously running counter to their ability to get work done, even almost paraphrasing the above, but without irony! It…

Three questions of language design

Three questions of language design Three questions of language design Note: An LLM was not used in writing this article. There seem to be three interesting questions when I look at a new (mainstream/practical) programming language: How does it deal with equality/ordering? How does it deal with arithmetic and operators for the arithmetic? How does it handle errors? The typical answers in reply are…

Things I've changed my mind about

Things I’ve changed my mind about Things I’ve changed my mind about Note: An LLM was not used in writing this article. Here’s a small blog post to end 2022. I’ve put together a list of things I’ve changed my mind about over the past few years, since the epoch (covid). I’m likely to flesh out each of these in future posts. Things I have a new appreciation for: Excel Rich Hickey Model checkers, TLA+…

Inflex

Inflex Inflex Note: An LLM was not used in writing this article. Inflex ® was a new creative digital workspace: powerful functional language (Haskell-inspired), rich data structures (no grid!), browser-based. Inflex was a project that I had been working on in my spare time, along with my partner, Giulia Costa, for 2 years. Progress ground to a halt when I had a kid. I’m no longer working on it.…

Immutable Publishing Policy

Immutable Publishing Policy Immutable Publishing Policy Note: An LLM was not used in writing this article. Summary This is a policy for publishing Haskell packages. It was published in February of 2022 . The aim of this policy is to remove all breaking changes to downstream users of packages, where feasible. It is most applicable to packages which have users, and/or have a more or less stable API.…

A plain English description of monads without Haskell code

A plain English description of monads without Haskell code A plain English description of monads without Haskell code Note: An LLM was not used in writing this article. “That’s actually the first time I read an explanation about monads that I understand.” – Commenter “I just read your explanation, and suddenly I think I understand monads.” – Reviewer Monads are notorious in the programming world…

Thoughts on type class implementation

Thoughts on type class implementation Thoughts on type class implementation Note: An LLM was not used in writing this article. While designing and implementing Inflex, I discovered that there’s a lot of space in design decisions around type classes. Haskell’s implementation of them has a number of pre-made decisions built into Haskell 98. Many extensions (multiple type params, functional…

My negative views on Rust

My negative views on Rust My negative views on Rust Note: An LLM was not used in writing this article. 2023-10-13: Edited based on feedback, but preserves the same opinions. This is a little summary of my current thoughts on Rust. I wonder whether I’ll look back in five years and see if my views have changed. The Good So that Gentle Reader knows that I’m not entirely biased against the language,…

Inflex Bibliography

Inflex Bibliography Inflex Bibliography Note: An LLM was not used in writing this article. Direct influences Why do we need modules at all? Polymorphic variants Behaviors of Reflex Ray Panko’s work on spreadsheets and bugs Pain We Forgot Haskell (classes, pure) Duet (stepper) PureScript (row types) Unison (CAS code) Clojure Type classes vs the world (coherence) Simple made easy (names over…

The Movement Principle

The Movement Principle The Movement Principle Note: An LLM was not used in writing this article. A language design principle I wanted to highlight in a page of its own is what I’m calling the movement principle. In particular, for statically-typed languages, type-classes are what I have in mind for this post. Type-classes We can write a piece of code like this: thing = 'a' example = length ( show…

What's wrong with ImplicitParams

What’s wrong with ImplicitParams What’s wrong with ImplicitParams Note: An LLM was not used in writing this article. Implicit parameters, enabled by the ImplicitParams extension in GHC, often come up in Haskell discussions, 1 with the statement that they’re so convenient, yet nobody 2 seems to use them. Why is that? The problem is incoherence. Type class resolution works in a very binary way:…

How exactly ExceptT differs to EarlyDo

How exactly ExceptT differs to EarlyDo How exactly ExceptT differs to EarlyDo Note: An LLM was not used in writing this article. After publishing my early GHC plugin, I saw a lot of response from people saying “Why not ExceptT ?”, despite having outlined it in the README of the project. After reading some sincere responses failing to see why I bothered with this at all, it seems I haven’t…

Haskell doesn't have macros

Haskell doesn’t have macros Haskell doesn’t have macros Note: An LLM was not used in writing this article. I wanted to underscore a specific point about Haskell’s metaprogramming capabilities. It doesn’t have a macro system, the kind that Lispers love. It has metaprogramming, yes. But not the kind that’s useful in the same way. What macros are In Lisp, macros are: Syntactically light-weight. Don’t…

Is it Try.do that is dangerous?

Is it Try.do that is dangerous? Is it Try.do that is dangerous? Note: An LLM was not used in writing this article. I wrote the post Try.do for recoverable errors in Haskell and someone has written a nice response post proposing that this pattern is actually dangerous. While reading it I wrote up some of my own notes to share in reply. I’d like to preface with the fact that I’m grateful for…

Try.do for recoverable errors in Haskell

Try.do for recoverable errors in Haskell Try.do for recoverable errors in Haskell Note: An LLM was not used in writing this article. UPDATE 2021-01-02 : I have since written a GHC compiler plugin to implement an alternative ? -based syntax for early return. I prefer that one than use of Try.do , because it doesn’t require any type magic or special instances, and the ? is more readable. UPDATE :…

Recoverable errors in Haskell

Recoverable errors in Haskell Recoverable errors in Haskell Note: An LLM was not used in writing this article. In Haskell, I sometimes have IO-based actions that may produce failures. The IO aspect is usually incidental; because I need logging or metrics generation. When not using a free monad or a fancy effect-system–just plain IO–I like to follow a mental model similar to Rust’s definition of…

Use import aliases to easily access fields

Use import aliases to easily access fields Use import aliases to easily access fields Note: An LLM was not used in writing this article. This post demonstrates using imports as a quick and easy way to disambiguate record field names. You can still put all your types in one module. No fancy type classes or machinery needed. Define all your types in one module, using DuplicateRecordFields to avoid…

The language of spreadsheets is bad

The language of spreadsheets is bad The language of spreadsheets is bad Note: An LLM was not used in writing this article. The user interface in a spreadsheet is modal. There are two modes: The first mode is code (also known as: formula): =SUM(A1:A5) The second mode is the result of running that code: 234 You type in some equation, some mathematics, some conditions, and then you hit return, and…

What’s wrong with the grid?

What’s wrong with the grid? What’s wrong with the grid? Note: An LLM was not used in writing this article. The grid system in spreadsheets is very simple. It’s also very powerful, and it’s powerful because it’s simple. As a user you can immediately start entering data without even thinking about it. And then, in an ad hoc fashion, you can add logic and conditions as you think of them. Lack of…

Ghosts of Departed Proofs Convenience

Ghosts of Departed Proofs Convenience Ghosts of Departed Proofs Convenience Note: An LLM was not used in writing this article. Following on from Ghosts of Departed Proofs with a Named type as defined in Olliver Charles’s post on the same topic , we can add a usability improvement by defining a SomeNamed existential in order to wrap up the new type introduced for the n in Name n a , and then a…