Community version of “Learn You a Haskell…” (https://learnyouahaskell.github.io/) — 2026 update

Hey all,

Maintainers of the community version of LYAH were busy at work updating the technology behind the website to hopefully attract new contributors and boost interest in this classic text. Here are three main updates done around the turn of the last year.

Go All In on Markdown

The site used to be a collection of HTML pages. For a couple of years now, there was an effort to switch to Markdown, but it was never finished before 2026. In fact, we were in a sorry state maintaining two versions of the site and getting divergencies all the time. No more. We killed the HTML version and switched to Markdown altogether. (See: Switch to Markdown by ulysses4ever · Pull Request #103 · learnyouahaskell/learnyouahaskell.github.io · GitHub and prior PRs linked from there.)

Switching to Hakyll

The initial port to Markdown used a rather hairy bash/sed script for conversion. It’s all Hakyll now. (See Move from Bash/sed to Haskell/Hakyll for site generation by ulysses4ever · Pull Request #110 · learnyouahaskell/learnyouahaskell.github.io · GitHub ).

Dark Mode

In collaboration with GitHub Copilot, we created an experimental dark mode for the website. It would benefit from stress-testing and eyeballing, please open an issue if anything comes up. To try it out, use the little Sun/Moon switcher at the top right. (PR: Add dark mode with persistent theme toggle by Copilot · Pull Request #117 · learnyouahaskell/learnyouahaskell.github.io · GitHub)

Finally: Call for Contributions (update the text itself!)

This is the main point of this post: please consider picking an issue and help in solving it. There are many low-hanging fruits in there (but also more substantial ones): the text is old and outdated in many (mostly minor) ways.

Bonus: Future Plans

I will try to attend to commuinity contributions to the text (the point above) but I’m personally interested more in updating the technology even more. Two primary thoughts I had is:

  1. Automating checks that the code blocks are still executable (in CI). I started experimenting with a Pandoc filter that could check that: GitHub - ulysses4ever/lyah-eval · GitHub Let me know if you’re interested in contributing there.
  2. Adding “execute” buttons for the code blocks in the interface (like in Rust book: e.g. Hello, World! - The Rust Programming Language has an executable snippet printing Hello World, etc.).

One other pain point of mine: the black background of the code blocks. Having those high-contrast elements in the design is a well-known antipattern. I hope we’ll find a way to improve it without departing too far from the original style.

24 Likes

Fantastic stuff, thanks for you effort!

2 Likes

All references to the State constructor from Control.Monad.State don’t compile as they need to use the state function instead. An upstream solution might be adding a pattern synonym to transformers, but I think it’s a lot easier to just make this lowercase!

3 Likes

Quite right, thank you for pointing this out! In fact, we have had a ticket about it since 2022: State monad + other monads defined in transformers are out of date · Issue #7 · learnyouahaskell/learnyouahaskell.github.io · GitHub we’d be delighted to have someone contributing a fix for this!

1 Like