Covariance and Controvariance_ a fresh look at an old issue (a primer in advanced type systems for learning functional programmers)