Chris Penner
chrispenner.ca
Chris Penner
@chrispenner.ca
FP and Programming languages nerd
Building the Unison Language & Unison Share

📍Victoria BC 🇨🇦

https://chrispenner.ca
Reposted by Chris Penner
In "a new programming paradigm" Dejan Milicic goes into why @unison-lang.org is so unique and useful: docs.google.com/presentation...
Unison: A New Programming Paradigm
print(("Unison", newline)); print("A new programming paradigm") Dejan Miličić JetBrains
docs.google.com
November 15, 2025 at 9:26 AM
Want to try a radically innovative programming language?
Unison is ready!

Unison is approachable, user-friendly, and has a great community of friendly folks :)

On top of that it has mind-bending features like serializable function closures and built-in distributed programming tools!
November 25, 2025 at 7:31 PM
I collected my thoughts on why mutexes suck; and what we can do about it.
chrispenner.ca/posts/mutexes

#STM #concurrency #parallelism #mutexes #Haskell
Ditch your (mut)ex, you deserve better
Mutexes are unreliable tools, let's explore better alternatives.
chrispenner.ca
November 11, 2025 at 7:51 PM
Reposted by Chris Penner
🚀 New deep dive: Distributed System Engineering in Unison

In our latest blog post, take a look at the design of the Volturno library: a distributed stream processing engine built atop Unison Cloud.

www.unison-lang.org/blog/volturn...
Distributed system engineering in Unison: Volturno · Unison programming language
We look at the design of Volturno, a streaming engine with exactly-once processing, to illustrate why Unison Cloud is a great enabler for distributed systems builders.
www.unison-lang.org
November 4, 2025 at 8:26 PM
Reposted by Chris Penner
🤯 Unison in the browser!?

Dan Freeman's new library, Proscenium, runs Unison code in WebAssembly.

Its companion library, @dfreeman/playbill, contains a walk-through of various features and live examples on Unison Cloud!

Play a game in your browser entirely in Unison; better yet, write your own!
@dfreeman/playbill | Unison Share
A walkthrough of building UIs with Proscenium, including several example apps.
share.unison-lang.org
October 28, 2025 at 6:01 PM
Reposted by Chris Penner
📽️ Here's a quick video for anyone just getting started with Unison.

The gist of it: install the UCM, create a scratch file in the right place, and have fun programming!
Starting the UCM and setting up a scratch file
This video covers the basics of starting the Unison Codebase Manager (UCM) and writing your first bits of Unison code in a scratch file. We walk through: * Installing Unison on your system (Mac, Linux, or Windows) * Starting the UCM in a working directory * Creating .u scratch files and ensuring the UCM is watching for changes Helpful links: * Install Unison here: https://www.unison-lang.org/docs/quickstart/#step-1-install-unison * Get the UCM Desktop app: https://github.com/unisonweb/ucm-desktop/releases * Join the Unison community: https://www.unison-lang.org/discord
youtu.be
October 22, 2025 at 6:19 PM
Don't get too hung up on #Monads, there are other ways to sequence effects; including Arrows; and they provide even better static analysis!

Let me know what you think :)

#Haskell

chrispenner.ca/posts/arrow-...
Exploring Arrows for sequencing effects
Monads are <em>one</em> way to sequence effects, but they're not the only way!
chrispenner.ca
October 21, 2025 at 2:41 AM
I'd really like to speak with whoever thought it was a good idea for the public and private JWK's to be represented by the same type, have the same name, with just a few missing parameters...

Ah yes, the presence or absence of this "d" parameter could tank my entire company... seems safe to me :|
October 15, 2025 at 9:54 PM
Having a 3D printer at home is such a life-hack. Just printed some custom french-cleats to hang a giant 7ft long painting and it made it 10x easier.
October 12, 2025 at 5:49 PM
I've spent hours over the last months writing a post about how mutexes suck and everyone should use STM instead; but have come to the realization that even STM is more complex than necessary.

What's your decision-making process when building a concurrent and/or parallel system?

See mine below 👇
October 11, 2025 at 11:31 PM
Reposted by Chris Penner
I wrote about AI and programming.

About the identity challenges we are facing as programmers and the potential erasure of craft.

There's a fun little easter egg in the header as well :)

hojberg.xyz/the-programm...
The Programmer Identity Crisis ❈ Simon Højberg ❈ Principal Frontend Engineer
On AI, Creativity, and Craft
hojberg.xyz
October 7, 2025 at 11:42 PM
I'm very pleased to call Simon ( @hojberg.xyz ) my co-worker, team-mate and friend, go check out this wonderfully written take.

hojberg.xyz/the-programm...
The Programmer Identity Crisis ❈ Simon Højberg ❈ Principal Frontend Engineer
On AI, Creativity, and Craft
hojberg.xyz
October 8, 2025 at 8:01 PM
IMO we shouldn't be trying so hard to solve "the expression problem"; We should make it easy to update existing functions when types change, but it shouldn't always "silently work" with the new type; oftentimes existing functionality needs a human to look over it when there are changes!
October 8, 2025 at 7:37 PM
What do folks out there do for error handling in concurrent tasks in #Haskell?

For now I've settled on having an error `TMVar`, then use a `ki` structured concurrency scope which forks all my jobs and ends in an `(Right <$> awaitAll) <|> (Left <$> readTMVar errVar)`
October 6, 2025 at 7:40 PM
TIL callCC's return value isn't rank 2 polymorphic (but you can just route it through Void and use `absurd` to make it rank 2 polymorphic)

Spent too long staring at the error wondering why it wasn't working haha.

#Haskell

github.com/haskell/mtl/...
Why not use rank 2 polymorphism for `callCC` · Issue #127 · haskell/mtl
I think rank 2 polymorphism is a must-have for callCC, or this code will not compile: f :: Int -> String f x = (`runCont` id) $ callCC $ \exit -> do y <- case x of 0 -> exit "error: x == 0" _ -> pu...
github.com
October 6, 2025 at 7:35 PM
Huh, TIL that `Text.lines != Text.splitOn "\n"` when the string ends in a newline.
October 3, 2025 at 7:22 PM
Reposted by Chris Penner
You can now spin up Unison Cloud clusters on your own infrastructure!

✅ Build elastic distributed systems and services in vastly less code
✅ Fast, typed RPC
✅ Deployments in seconds
✅ Free to get started

youtu.be/0sZqI1XoGLY
Unison Cloud on your infrastructure
YouTube video by Unison Language
youtu.be
October 1, 2025 at 7:39 PM
Reposted by Chris Penner
Interesting article by @chrispenner.ca about why monads aren't the solution to everything, and a functor I've never crossed paths with called selective applicatives.

Still absorbing it, but great read as always. Check it out if that's your thing.

chrispenner.ca/posts/expres...
Monads are too powerful: The Expressiveness Spectrum
Monads are a useful tool, but what costs do we pay for their expressive power?
chrispenner.ca
September 27, 2025 at 12:55 PM
New blog post!

#Haskell is built on a foundation of Monads, but are they really the optimal way to sequence effects or should we keep looking for something better?

What's the big deal with Applicatives and Selective Applicatives?

Read on!

chrispenner.ca/posts/expres...
Monads are too powerful: The Expressiveness Spectrum
Monads are a useful tool, but what costs do we pay for their expressive power?
chrispenner.ca
September 27, 2025 at 4:02 AM
Reposted by Chris Penner
✨ The new dependents view shows everywhere a definition is used, broken down by category, as a separate card in Unison Share and the Unison Desktop app.

Your codebase is a bidirectional graph! You should be able to walk it as such.
September 26, 2025 at 8:01 PM
I'm pretty stoked on how well WASM seems to be working for languages that target it (not that there aren't difficulties there).

Even more stoked for these updates!
September 18, 2025 at 9:09 PM
It may in fact be a VeryBadIdea™ but I'm extremely tempted to duct tape my soldering iron to my 3D printer and use it to wood-burn the grid lines on the Go board I'm building...
September 16, 2025 at 5:48 AM
We all know AI is unreliable, but what's the worst case you've seen?

#zig
This one made me exhale sharply through my nose today:
September 8, 2025 at 2:46 AM
Programming languages really need a way to expose functions as "you can import this within this project and tests, but it's not public to other libraries"; somewhere in-between fully public and fully private.
August 22, 2025 at 4:30 PM