隐式与显式子类型化


18

页面断言

许多语言不使用隐式子类型(结构等效),而是使用显式/声明子类型(声明等效)

我主要使用的编程语言使用显式子类型。如上面的注释所述,隐式子类型化的优点是什么?


1
在常见问题解答中,关于此次交流的范围来自“常见问题解答”:“该领域的工作通常以对数学技术和严格性的重视而著称。” 我之所以投票,是因为我在这个问题的答案中没有看到任何严格的要求。
David Eppstein 2010年

6
可悲的是,回答这个问题的严谨程度比您最初希望的要大得多。许多非常杰出的人在90年代的摔角中烧掉了很多关于子类型的琐碎问题。不幸的是,该地区的努力回报率非常低。
Neel Krishnaswami

6
是的,有很多的空间,数学和严谨在回答这个问题之前,或至少在数学上解释隐含的子类型是什么。我不确定付出率。
Noam Zeilberger 2010年

1
我可能应该说这是“非常艰苦的”,因为经过反省,我意识到我对答案非常感兴趣。
Neel Krishnaswami

1
好吧,我坚信。我将删除我的否决票,但系统不允许我这样做。
David Eppstein

Answers:


19

简短的答案是“验证现有代码的其他属性”。答案更长。

我不确定“隐式”还是“显式”是好的术语。这种区别有时称为“结构”与“标称”子类型。然后,在结构子类型的可能解释中还有第二个区别(简短描述)。请注意,子类型的所有三种解释实际上都是正交的,因此将它们相互比较而不是理解它们的用法并没有什么意义。

在解释结构子类型关系A <:B时,主要的操作区别是它是由具有(运行时/编译时)计算内容的真实强制见证还是由身份强制见证。如果是前者,则必须保持的重要理论性质是“连贯性”,即,如果有多种方法表明A是B的子结构子类型,则每个伴随的强制都必须具有相同的计算内容。

您给出的链接似乎是对结构子类型的第二种解释,其中A <:B可以通过身份强制来见证。出于幼稚的观点,一个类型代表一组值,这有时被称为子类型的“子集解释”,因此,如果A类型的每个值也是B类型的值,则A <:B。有时被称为“优化类型”,Freeman&Pfenning的ML优化类型是一本很好的原始动机读物。有关F#的最新化身,您可以阅读Bengston等人的提炼类型以实现安全的实现。基本思想是采用一种现有的编程语言,该语言可能(或可能没有)已经具有类型,但是其中的类型不能保证那么多的类型(例如,仅内存安全性),并考虑使用第二层类型来选择具有以下内容的程序子集:其他更精确的属性。

(现在,我要指出的是,这种对子类型的解释背后的数学理论仍然没有得到应有的理解,也许是因为它的用途没有得到应有的广泛认可。一个问题是“集合值的解释太过幼稚,因此有时会被抛弃而不是精致。有关子类型的解释值得更多数学关注的另一论点,请阅读抽象石对偶中有关 Paul Taylor的子空间的介绍。)


A×B×C<:A×BCAB

1
优化器的工作是找出最佳的内存布局,因此作为身份的强制实际上应该是优化的结果。
Andrej Bauer 2010年

2
因此,为了澄清安德烈(Andrej)关于我的回答的评论,在细化类型解释中,子类型关系始终通过定义强制性见证,因为细化类型没有额外的计算内容。换句话说,如果A和B是值X类型的两个细化(“子集” /“属性”),则A <:B断言对于X中的每个值x,如果x:A也是x:B。可以验证或伪造这样的语句,但是在运行时它不起作用,因为x:A和x:B的证明在运行时不存在。
Noam Zeilberger 2010年

1
N{x:N|x<232}

3
N{x:N|x<232}N{x:N|x<232}
Noam Zeilberger 2010年

4

此答案是对Noam出色答案的一种最小补充。一个令人感兴趣的数据点是C ++概念的命运,其起源是试图统一类型的名义和结构概念。

这里有一篇很棒的文章,其中包含许多相关讨论的链接:http : //bartoszmilewski.wordpress.com/2010/06/24/c-concepts-a-postmortem/

但是,以上文章并未深入讨论名义与结构问题。这里还有另外一篇文章,内容如下:http : //nerdland.net/2009/07/alas-concepts-we-hardly-knew-ye/

关键文件都指向是Bjarne的Stroustrup的“简化使用概念”:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2906.pdf,其进入实际深入遇到的问题。

总体而言,讨论比实际更严格。但是,它很好地洞察了这些问题中涉及的各种权衡,尤其是在现有大量语言的情况下。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.