I appreciate this article. It's clear, easy to understand, and uses theory to propose practical improvements to FP.<p>Some minor nitpicks:<p>> In total functional programming ⊥ does not exist.<p>That doesn't seem right. In total FP, we can still define a ⊥ type that has no values. I think the problem here is that the author uses ⊥ to indicate both a type and a value of that type (e.g. f ⊥ = ⊥), which is confusing.<p>> 0 / 0 = 0<p>Surely it would be better to use a Maybe type for this instead?<p><pre><code> 0 / 1 = Just 0
0 / 0 = Nothing
</code></pre>
The same approach also addresses the difficulty of hd:<p><pre><code> hd :: List a -> Maybe a
hd (Cons a x) = Just a
hd Nil = Nothing
</code></pre>
F# has this function, and calls it "tryHead", rather than just "head".