Types and Programming Languages by Benjamin C. Pierce