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

  1. 1
    Beating Decades of Optimized C with 80 Lines of Haskell
    4 people · 176 points · first shared 2019 · 185 comments on HN
  2. 2
    Monads are too powerful: The expressiveness spectrum
    4 people · 71 points · first shared 2025 · 65 comments on HN
  3. 3
    Ditch your mutex, you deserve better
    3 people · 171 points · first shared 2025 · 203 comments on HN
  4. 4
    You Should Add Debug Views to Your DB
    3 people · 92 points · first shared 2025 · 38 comments on HN
  5. 5
  6. 6
    Silly job interview questions in Haskell
    2 people · 93 points · first shared 2020 · 70 comments on HN
  7. 7
    ASTs with Fix and Free
    2 people · 3 points · first shared 2018 · discussion on HN
  8. 8
    Exploring Arrows for Sequencing Effects
    2 people · 1 points · first shared 2025 · discussion on HN
  9. 9
    Tail recursion in Python
    1 people · 193 points · first shared 2018 · 80 comments on HN
  10. 10
    Optics and Regex: Greater than the sum of their parts
    1 people · 24 points · first shared 2019 · 7 comments on HN
  11. 11
    Using traversals to batch database queries
    1 people · 4 points · first shared 2025 · 1 comments on HN
  12. 12
    Vim vs. Emacs; is it really a competition?
    1 people · 3 points · first shared 2015 · 1 comments on HN
  13. 13
    A Practical Introduction to Finger Trees
    1 people · 2 points · first shared 2025 · discussion on HN
  14. 14
    Building Type Search for Unison
    1 people · 2 points · first shared 2024 · discussion on HN
  15. 15
    Advent of Optics: Day 1
    1 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…

Keyboard shortcuts

/Search
j kNext / previous blog
EnterOpen selected blog
vVisit the blog site
fFollow / unfollow
lSwitch grid / list view
dSwitch dark mode
g hHome
g pTop posts
g tTopics
g fFollowing
g lLiked
g yHistory
g qFAQ
EscBack / close