对语言设计的深入讨论 - 协变和逆变类型

时间:2012-03-02 11:19:44

标签: types variance

通过讨论我的意思是博客,书(最好)或类似的。

背景

我正在阅读Martin Odersky,Lex Spoon和Bill Venners的第二次Scala编程,我非常惊讶地阅读了关于协方差和逆变的文章。

我发布此问题的原因是这样 - 作者从构建类Queue开始,并讨论如何,何地,可以和不能使用协方差。每一步都是前一步的逻辑结果,但最后一步之一是将元素添加到队列(在前面):

(elem : Apple) :: (queue[Orange])

然而,在Scala中,它以这种方式工作,结果是类型为Fruit的队列。

这在我看来是错误的 - 如果有人想要Fruit的队列,那么它应该首先排队。根据我的喜好改变动态类型(即就像添加整数和字符串一样,只是为了获得object类型)。

由于上面提到的书是关于Scala的,而类型的差异只是其中的一部分,我正在寻找更实质的东西。

问题

因此问题 - 我应该阅读什么关于语言设计,关注类型差异?可能是Benjamin C. Pierce的任何机会“类型和编程语言”(它在我的购买清单上)?

1 个答案:

答案 0 :(得分:1)

Wikipedia for Covariance and Contravariance有点帮助。一般来说,协方差和逆变是非常酷的方面,并且在理解编程语言方面有一些深刻的影响,但我不确定如何了解它们作为程序员的内部工作方式。该领域的开创性工作由Liskov(以Liskov替代原则而闻名)完成。约翰库克也有一篇很好的文章that you can read!你可能会读到一些很酷的学术论文,即“多重继承的语义”(Luca Cardelli,他也写了一本非常好的书,我还没有完全阅读,“对象理论”,涵盖了语义面向对象语言中的类似事物。)我认为首先提到编程语言中的共同/反差的论文是Liskov自己的“子类型的行为概念”。虽然我有一段时间没有读过这篇文章,但本文不仅对函数类型,而且对类型谓词进行了理论解释(这给出了关于类型系统如何与这些一般原理一起工作的更一般的描述) 。最后,如果幻灯片是你的事,杰夫福斯特(和我,作为TA)本学期在UMD教授编译器课程,他有一些很棒的slides on type systems!

要做一个小评论,编程语言设计比你发现的这种差异要大得多。如果你开始阅读Ben Pierce的TAPL,你很容易被书中的大多数其他主题分心,这些主题也很好。 Co和逆变很酷,但我认为在编程语言理论中你会发现许多其他同样很酷的东西,这让我感到震惊,远离最令人惊讶的事情: - )