Introduction to Types and Generic Programming