<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.3.3">Jekyll</generator><link href="https://blog.jez.io/feed/plt.xml" rel="self" type="application/atom+xml" /><link href="https://blog.jez.io/" rel="alternate" type="text/html" /><updated>2026-01-21T18:17:55-05:00</updated><id>https://blog.jez.io/feed/plt.xml</id><title type="html">Jake Zimmerman | Plt</title><subtitle>A collection of blog posts about programming, software, types, programming languages, Sorbet, Vim, Markdown, and more.</subtitle><author><name>Jake Zimmerman</name></author><entry><title type="html">Why have lower bounds on generics?</title><link href="https://blog.jez.io/lower-bounds/" rel="alternate" type="text/html" title="Why have lower bounds on generics?" /><published>2025-12-23T15:46:34-05:00</published><updated>2025-12-23T15:46:34-05:00</updated><id>https://blog.jez.io/lower-bounds</id><author><name>Jake Zimmerman</name></author><category term="sorbet" /><category term="ruby" /><category term="plt" /><category term="types" /><summary type="html"><![CDATA[Lower bounds expand the list of ways to create a value of that type. They behave similar to union types in that regard, but they fill a particular niche that only they can fill, relating to subtyping.]]></summary></entry><entry><title type="html">Past, Present, and Future of Sorbet Type Syntax</title><link href="https://blog.jez.io/history-of-sorbet-syntax/" rel="alternate" type="text/html" title="Past, Present, and Future of Sorbet Type Syntax" /><published>2025-04-25T01:57:00-04:00</published><updated>2025-04-25T01:57:00-04:00</updated><id>https://blog.jez.io/history-of-sorbet-syntax</id><author><name>Jake Zimmerman</name></author><category term="ruby" /><category term="sorbet" /><category term="types" /><category term="plt" /><summary type="html"><![CDATA[A discussion of how Sorbet's type syntax came to be, the problems it solves, and how it could improve.]]></summary></entry><entry><title type="html">Every type is defined by its intro and elim forms</title><link href="https://blog.jez.io/intro-elim/" rel="alternate" type="text/html" title="Every type is defined by its intro and elim forms" /><published>2023-04-23T19:43:00-04:00</published><updated>2023-04-23T19:43:00-04:00</updated><id>https://blog.jez.io/intro-elim</id><author><name>Jake Zimmerman</name></author><category term="programming" /><category term="plt" /><category term="types" /><summary type="html"><![CDATA[I took a course about programming languages in college. It was a very theory-oriented course, but as it turned out I learned more about how to write software from this theory course than many of my peers who took our school's software engineering elective.]]></summary></entry><entry><title type="html">Sorbet, Generics, and Parametricity</title><link href="https://blog.jez.io/sorbet-parametricity/" rel="alternate" type="text/html" title="Sorbet, Generics, and Parametricity" /><published>2022-02-18T02:59:55-05:00</published><updated>2022-02-18T02:59:55-05:00</updated><id>https://blog.jez.io/sorbet-parametricity</id><author><name>Jake Zimmerman</name></author><category term="ruby" /><category term="sorbet" /><category term="plt" /><summary type="html"><![CDATA[There's an interesting property in programming languages with generic types called "parametricity" that says all functions with a given generic type have to behave similarly, which is a powerful tool for understanding generic code.]]></summary></entry><entry><title type="html">Notes on Continuations</title><link href="https://blog.jez.io/continuations-notes/" rel="alternate" type="text/html" title="Notes on Continuations" /><published>2019-06-18T21:03:13-04:00</published><updated>2019-06-18T21:03:13-04:00</updated><id>https://blog.jez.io/continuations-notes</id><author><name>Jake Zimmerman</name></author><category term="recitation" /><category term="plt" /><category term="types" /><summary type="html"><![CDATA[Some recitation notes on continuations from when I was a teaching assistant for 15-312 at CMU.]]></summary></entry><entry><title type="html">ABTs in Haskell</title><link href="https://blog.jez.io/abts-in-haskell/" rel="alternate" type="text/html" title="ABTs in Haskell" /><published>2017-11-12T01:31:41-05:00</published><updated>2017-11-12T01:31:41-05:00</updated><id>https://blog.jez.io/abts-in-haskell</id><author><name>Jake Zimmerman</name></author><category term="plt" /><category term="haskell" /><category term="fragment" /><summary type="html"><![CDATA[I've been learning and using Haskell on-and-off for the past couple of years. One of my early complaints was that I couldn't find a good library for working with variables and binding that used locally nameless terms. Recently though, I found unbound-generics, which checks all my previously unfilled boxes.]]></summary></entry><entry><title type="html">Variables and Binding</title><link href="https://blog.jez.io/variables-and-binding/" rel="alternate" type="text/html" title="Variables and Binding" /><published>2017-10-28T22:04:01-04:00</published><updated>2017-10-28T22:04:01-04:00</updated><id>https://blog.jez.io/variables-and-binding</id><author><name>Jake Zimmerman</name></author><category term="plt" /><summary type="html"><![CDATA[Nearly every interesting programming language feature derives its power from variables. Functions wouldn't be functions if not for variables. Modularity and linking reduce to variables and substitution. I've written in the past about all sorts of cool variables in types, as well as how parametric polymorphism in System F is the result of using type variables in two ways within the same system.]]></summary></entry><entry><title type="html">System Fω and Parameterization</title><link href="https://blog.jez.io/system-f-param/" rel="alternate" type="text/html" title="System Fω and Parameterization" /><published>2017-09-27T22:14:45-04:00</published><updated>2017-09-27T22:14:45-04:00</updated><id>https://blog.jez.io/system-f-param</id><author><name>Jake Zimmerman</name></author><category term="recitation" /><category term="sml" /><category term="plt" /><category term="types" /><summary type="html"><![CDATA[Some recitation-style notes on System F, polymorphism, and functions. I used to not know the difference between ∀(t.τ) and λ(u.c). Turns out, there's a huge difference!]]></summary></entry><entry><title type="html">Variables in Types</title><link href="https://blog.jez.io/variables-in-types/" rel="alternate" type="text/html" title="Variables in Types" /><published>2017-09-25T05:17:31-04:00</published><updated>2017-09-25T05:17:31-04:00</updated><id>https://blog.jez.io/variables-in-types</id><author><name>Jake Zimmerman</name></author><category term="recitation" /><category term="plt" /><category term="types" /><summary type="html"><![CDATA[Having variables in our type systems lends a great deal of power to languages using these type systems. We’re going to look at how variables are used in generic programming, inductive & coinductive types, and polymorphic types.]]></summary></entry></feed>