Source: https://www2.seas.gwu.edu/~bell/csci1121/lectures/types.pdf