https://medium.com/@andrew_johnson_4/building-a-compiler-for-a-modern-functional-language-from-scratch-in-rust-part-4-typing-926f33c5ca1d