title: Solid discussion of language design -- covariant and contravariant types
body: <p><em>By discussion I mean blog entry, book (preferably) or alike.</em></p>
  
  <h2>Background</h2>
  
  <p>I am reading for second time Scala Programming by Martin Odersky, Lex Spoon and Bill Venners and with great surprise I've read pieces about covariance and contravariance.</p>
  
  <p>The reason I am posting this question is this -- the authors starts with building class Queue and discuss how, where, can and cannot covariance is used. Every step is logical result of preceding step, however one of the last step is adding element to queue (at front):</p>
  
  <pre><code>(elem : Apple) :: (queue[Orange])
  </code></pre>
  
  <p>However in Scala it works this way, that the result is queue with type Fruit.</p>
  
  <p>And this is in my opinion wrong -- if someone would like queue of Fruits, it should be such queue in the first place. Changing type on-fly is too dynamic for my taste (i.e. it is like adding ints and strings, just to get <code>object</code> type).</p>
  
  <p>Since mentioned book is about Scala, and variance of types is just a part of it, I am looking for something more substantial.</p>
  
  <h2>The question</h2>
  
  <p>Thus <strong>the question</strong> -- what should I read about language design, focused on type variance? Could it be by any chance "Types and Programming Languages" by Benjamin C. Pierce (it is on my to-buy list)?</p>