Every day is International Backup Awareness Day . If you haven’t received an email from Haskell Weekly in a while, you’re not the only one! The last successful newsletter email went out on February 12th, which was a little more than a month ago. Unfortunately something caused the subscriber list to be reset. The problem is fixed now, but you will have to re-subscribe . I’ve been running Haskell…
I am not an iOS developer, but a few days ago I published an iOS app called Pylo . Sure, I have been writing software professionally for nearly 20 years. I even wrote an iOS app before, but the latest commit to that was more than 15 years ago. As you might guess, I used artificial intelligence to create this app. Specifically I used Claude Code on Anthropic’s Max (5x) plan. The whole process from…
Homer: There’s three ways to do things: The right way, the wrong way, and the Max Power way. Bart: Isn’t that the wrong way? Homer: Yeah, but faster! I’m happy to announce Scrod , a tool for quickly generating Haskell documentation. Unlike Haddock, Scrod only requires you to parse your module rather than fully compile it. This makes it much faster but somewhat less precise. Scrod works in the…
If you’re still using cabal upload --username USERNAME --password PASSWORD to publish your Haskell packages, it’s time for an upgrade. Hackage tokens provide a more secure and flexible alternative that every Haskell developer should adopt. Instead of using your password directly, use: cabal upload --token TOKEN Update 2025-06-12: If you use Stack, set the HACKAGE_TOKEN environment variable when…
I maintain a small handful of Haskell packages. I keep a dashboard of all of them. I have been maintaining some of them for nearly a decade. Naturally I have developed some opinions about how to maintain them. A recent discussion on the Haskell Discourse prompted me to write down my thoughts. This post will describe which versions of GHC I support for my Haskell packages and why. I’m not trying to…
I have been running the Haskell Weekly newsletter for more than eight years. For that entire time, Mailchimp has been responsible for sending the emails. Starting this week, that is going to change. The emails will instead be sent by listmonk (via Amazon Simple Email Service ). If you’re a subscriber, you may notice that some things are slightly different, like formatting and styling. But most of…
I’m happy to announce Heptapod , a tiny Haskell library for generating version 7 UUIDs. If you’re not familiar with UUIDv7s, they are defined by RFC 9562 . As a brief summary, they are sort of like a mix of UUIDv1s and UUIDv4s. They start with a timestamp and end with some randomness. Here’s a diagram of their layout: 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1…
I don’t write Haddock markup all that often. It’s similar to Markdown but different in a few ways that I always forget. I’ve often wanted a web-based tool for previewing what some Haddock will look like. Over the weekend I put one together. I call it the Haddock Dingus , after the original Markdown Dingus . It’s pretty simple: Input some Haddock, click “Submit”, and see what the output HTML looks…
Sometimes when writing a Haskell module you want to use an identifier that would be ambiguous. For example perhaps you’re writing a logger and want to call a function log . That’s a problem because the Prelude also defines a function called log . You can’t use either one without disambiguating. Usually you will disambiguate by qualifying the identifier like MyLogger.log . This is fine but it is a…
Typically in Haskell you have to import things before you can use them. This is widely considered to be a good idea. However sometimes it’s convenient to use something without importing it, as long as that thing is unambiguous. That’s what GHCi’s -fimplicit-import-qualified flag, which is enabled by default, does for you. For example the following works in GHCi even if you haven’t imported…