1

通过讨论,我的意思是博客条目、书籍(最好)或类似的东西。

背景

我正在第二次阅读 Martin Odersky、Lex Spoon 和 Bill Venners 的 Scala Programming,我非常惊讶地阅读了有关协变和逆变的文章。

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

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

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

在我看来这是错误的——如果有人想要水果队列,首先应该是这样的队列。即时更改类型对我来说太动态了(即,它就像添加整数和字符串,只是为了获取object类型)。

由于提到的书是关于 Scala 的,类型的变化只是其中的一部分,我正在寻找更实质性的东西。

问题

因此问题是——关于语言设计,我应该读什么,专注于类型变化?有没有可能是 Benjamin C. Pierce 的“类型和编程语言”(它在我的购买清单上)?

4

1 回答 1

1

协方差和逆变的维基百科有点帮助。一般来说,协变和逆变是很酷的小分,并且对理解编程语言有一些深刻的影响,但我不确定了解它们作为程序员的内部工作有多大帮助。该领域的开创性工作是由 Liskov(以 Liskov 替代原理而闻名)完成的。您还可以阅读John Cook 的一篇不错的文章!您可能会阅读一些很酷的学术论文,即“多重继承的语义”(Luca Cardelli,他还写了一本我没有完全阅读过的非常好的书,“对象理论”,涵盖了类似的内容语义面向对象语言。)我相信首先提到编程语言中协/逆变的论文是 Liskov 自己的“子类型的行为概念”。虽然我有一段时间没有读到这篇文章,但这篇论文不仅对函数类型,而且对类型谓词给出了理论说明(这给出了类型系统如何与这些一般原则一起工作的更一般的描述) . 最后,如果你喜欢幻灯片,Jeff Foster(和我,作为助教)本学期在 UMD 教授编译器课程,

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

于 2012-03-07T00:49:47.620 回答