diff --git a/content/blog/01_types_basics.md b/content/blog/01_types_basics.md
index 88c5593..a4b5e04 100644
--- a/content/blog/01_types_basics.md
+++ b/content/blog/01_types_basics.md
@@ -138,7 +138,7 @@ of this sort doesn't inspire faith in this approach.{{< /message >}}
{{< message "answer" "Daniel" >}}
You raise a good point. I am not defining \(n\) to be "any expression that
has type \(\text{number}\)"; rather, there are two meanings to the word "number"
-in usue here. First, there's number-the-symbol. This concept refers to the numerical
+in use here. First, there's number-the-symbol. This concept refers to the numerical
symbols in the syntax of our programming language, like 1
, 3.14
or 1000
.
Such symbols exist even in untyped languages. Second, there's number-the-type, written
in our mathematical notation as \(\text{number}\). This is, as we saw earlier, a
@@ -299,9 +299,9 @@ provide rules for all of the possible scenarios. Rather, we'd introduce a genera
framework of subtypes, and then have a small number of rules that are responsible
for converting expressions from one type to another. That way, we'd only need to list
the integer-integer and the float-float rules. The rest would follow
-from the conversion rules.
-
-{{< todo >}}Cite/ reference subtype stuff {{< /todo >}}
+from the conversion rules. Chapter 15 of _Types and Programming Languages_
+by Benjamin Pierce is a nice explanation, but the [Wikipedia page](https://en.wikipedia.org/wiki/Subtyping)
+ain't bad, either.
Subtyping, however, is quite a bit beyond the scope of a "basics"
post. For the moment, we shall content ourselves with the tedious approach.
@@ -323,6 +323,44 @@ for instance, these papers on improving type error messages, as well
as this tool that showed up only a week or two before I started writing
this article.
-{{< todo >}}Cite/ reference type error stuff {{< /todo >}}
+- [Chameleon](https://chameleon.typecheck.me/), a tool for debugging Haskell error messages.
+- [This paper](https://dl.acm.org/doi/10.1145/3412932.3412939), titled _Type debugging with counter-factual type error messages using an existing type checker_.
+- [Another paper](https://dl.acm.org/doi/10.1145/507635.507659), _Compositional explanation of types and algorithmic debugging of type errors_.
-I think this is all I wanted to cover in this part.
+I think this is all I wanted to cover in this part. We've gotten a good start!
+Here's a quick summary of what we've covered:
+
+1. It is convenient to view a type as a category of values that have
+ similar behavior. All numbers can be added, all strings can be reversed,
+ and so on and so forth. Some types in existing programming languages
+ are the `number` type from TypeScript, `i32` and `int` for integers in Rust
+ and Java, respectively, and `float` for real
+ {{< sidenote "right" "float-not-real" "(kinda)" >}}
+ A precise reader might point out that a floating point number can only
+ represent certain values of real numbers, and definitely not all of them.
+ {{< /sidenote >}}
+ numbers in C++.
+2. In programming language theory, we usually end up with two languages
+ when trying to formalize various concepts. The _object language_
+ is the actual programming language we're trying to study, like Python
+ or TypeScript. The _meta language_ is the language that we use
+ to reason and talk about the object language. Typically, this is
+ the language we use for writing down our rules.
+3. The common type-theoretic notation for "expression \\(x\\)
+ has type \\(\\tau\\)" is \\(x : \\tau\\).
+4. In writing more complicated rules, we will frequently make use
+ of the inference rule notation, which looks something like
+ the following.
+ {{< latex >}}
+ \frac{P_1 \quad P_2 \quad ... \quad P_n}{P}
+ {{< /latex >}}
+ The above is read as "if \\(P_1\\) through \\(P_n\\) are
+ true, then \\(P\\) is also true."
+5. To support operators like `+` that can work on, say, both numbers
+ and strings, we provide inference rules for each such case. If this
+ gets cumbersome, we can introduce a system of _subtypes_ into our
+ type system, which preclude the need for creating so many rules;
+ however, for the time being, this is beyond the scope of the article.
+
+Next time we'll take a look at type checking expressions like `x+1`, where
+variables are involved.