Chris Penner
chrispenner.ca · Personal blog · on HN since 2015
Chris Penner writes about Haskell, functional programming, optics, monads, and software design patterns.
What HN saysCommenters point to his posts on expressiveness and arrows for examples, and one cites his approach for keeping game clients in sync with a server.
27HN people shared it
6linked it in comments
27stories submitted
1.0Kstory points
4 months agolast shared
2015people per year2026
Most-shared posts
- 1Beating Decades of Optimized C with 80 Lines of Haskell4 people · 176 points · first shared 2019 · 185 comments on HN
- 2Monads are too powerful: The expressiveness spectrum4 people · 71 points · first shared 2025 · 65 comments on HN
- 3Ditch your mutex, you deserve better3 people · 171 points · first shared 2025 · 203 comments on HN
- 4You Should Add Debug Views to Your DB3 people · 92 points · first shared 2025 · 38 comments on HN
- 5Generalizing 'jq' and Traversal Systems using optics and standard monads2 people · 161 points · first shared 2020 · 98 comments on HN
- 6Silly job interview questions in Haskell2 people · 93 points · first shared 2020 · 70 comments on HN
- 7ASTs with Fix and Free2 people · 3 points · first shared 2018 · discussion on HN
- 8Exploring Arrows for Sequencing Effects2 people · 1 points · first shared 2025 · discussion on HN
- 9Tail recursion in Python1 people · 193 points · first shared 2018 · 80 comments on HN
- 10Optics and Regex: Greater than the sum of their parts1 people · 24 points · first shared 2019 · 7 comments on HN
- 11Using traversals to batch database queries1 people · 4 points · first shared 2025 · 1 comments on HN
- 12Vim vs. Emacs; is it really a competition?1 people · 3 points · first shared 2015 · 1 comments on HN
- 13A Practical Introduction to Finger Trees1 people · 2 points · first shared 2025 · discussion on HN
- 14Building Type Search for Unison1 people · 2 points · first shared 2024 · discussion on HN
- 15Advent of Optics: Day 11 people · 1 points · first shared 2019 · discussion on HN
What HN people wrote when they linked it
sullyj3 · 2021-03-16
Luckily, that very article exists!
https://chrispenner.ca/posts/wc
Edit: upon reading the article it seems like the'yre different kinds of word counting. Still interesting and worth reading nevertheless!
kibwen · 2026-07-17
Now we're just having a semantic argument over the word "expressiveness", which is not especially interesting; see https://chrispenner.ca/posts/expressiveness-spectrum . My argument above remains true regardless of the terms you choose to use.
internet_points · 2026-01-06
https://chrispenner.ca/posts/expressiveness-spectrum has some good examples showing why one might want selectives (then continues to explore arrows https://chrispenner.ca/posts/arrow-effects )
trealira · 2024-03-07
> Why is this taken as a given to be a good thing?
So that we can prove things about software more easily. If we only write stateful imperative programs, we're stuck with tons of Hoare triples and separation logic rather than being able to use equational reasoning or type-driven deductions. For example, this person wrote a parallel wc in Haskell, and they used semigroups to parallelize the word counting.
https://chrispenner.ca/posts/wc
rphln · 2021-08-12
I'm experimenting with this for client-server design in game development, to ensure that the clients are in sync with the server: since the only way to change the game state is through events, I (as a developer) am unable to forget to implement some notification for something that happens. This also gets me match replays as an extra.
I came across the Update Monad [1] while researching how to use Event Sourcing in functional languages: it basically has the same guarantees of only changing the state through recorded events. Beware though, as it can be quite slow if implemented naively.
[1]: https://chrispenner.ca/posts/update-monad
matt-noonan · 2024-12-02
Yes, there are a number of them. Here are some examples off the top of my head:
- Moggi was studying the problem of equivalence of programs, and noted that the traditional approach to modeling a program as a total function Input -> Output is problematic. He pioneered the use of monads and Kleisli categories as a foundation for reasoning about equivalence of real programs, including all the real-world nastiness like non-termination, partiality (e.g. throwing an exception that kills the program), non-determinism, and so on. https://person.dibris.unige.it/moggi-eugenio/ftp/lics89.pdf
- Linear logic (and it's close relative affine logic) was the inspiration behind Rust's ownership model, from what I understand. Linear logic was originally described in terms of the sequent calculus by Girard (http://girard.perso.math.cnrs.fr/linear.pdf), but later work used certain categories as a model of linear logic (https://ncatlab.org/nlab/files/SeelyLinearLogic.pdf). This answered and clarified a number of questions stemming from Girard's original work.
- Cartesian-closed categories (CCCs) form models of the simply-typed lambda calculus, in the sense that any lambda term can be interpreted as a value in a CCC. Conal Elliott pointed out that this means that a lambda term doesn't have just one natural meaning; it can be given a multitude of meanings by interpreting the same term in different CCCs. He shows how to use this idea to "interpret" a program into a circuit that implements the…