Answers:
简短的答案是“验证现有代码的其他属性”。答案更长。
我不确定“隐式”还是“显式”是好的术语。这种区别有时称为“结构”与“标称”子类型。然后,在结构子类型的可能解释中还有第二个区别(简短描述)。请注意,子类型的所有三种解释实际上都是正交的,因此将它们相互比较而不是理解它们的用法并没有什么意义。
在解释结构子类型关系A <:B时,主要的操作区别是它是由具有(运行时/编译时)计算内容的真实强制见证还是由身份强制见证。如果是前者,则必须保持的重要理论性质是“连贯性”,即,如果有多种方法表明A是B的子结构子类型,则每个伴随的强制都必须具有相同的计算内容。
您给出的链接似乎是对结构子类型的第二种解释,其中A <:B可以通过身份强制来见证。出于幼稚的观点,一个类型代表一组值,这有时被称为子类型的“子集解释”,因此,如果A类型的每个值也是B类型的值,则A <:B。有时被称为“优化类型”,Freeman&Pfenning的ML的优化类型是一本很好的原始动机读物。有关F#的最新化身,您可以阅读Bengston等人的提炼类型以实现安全的实现。基本思想是采用一种现有的编程语言,该语言可能(或可能没有)已经具有类型,但是其中的类型不能保证那么多的类型(例如,仅内存安全性),并考虑使用第二层类型来选择具有以下内容的程序子集:其他更精确的属性。
(现在,我要指出的是,这种对子类型的解释背后的数学理论仍然没有得到应有的理解,也许是因为它的用途没有得到应有的广泛认可。一个问题是“集合值的解释太过幼稚,因此有时会被抛弃而不是精致。有关子类型的解释值得更多数学关注的另一论点,请阅读抽象石对偶中有关 Paul Taylor的子空间的介绍。)
此答案是对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,其进入实际深入遇到的问题。
总体而言,讨论比实际更严格。但是,它很好地洞察了这些问题中涉及的各种权衡,尤其是在现有大量语言的情况下。