Эта страница утверждает, что
многие языки не используют неявный подтип (структурная эквивалентность), предпочитая явный / объявленный подтип (декларационная эквивалентность)
Я в основном использовал языки программирования, которые используют явные подтипы . Каковы преимущества неявного подтипирования, как описано в примечаниях выше.
pl.programming-languages
type-theory
Фрэнки Рибери
источник
источник
Ответы:
Краткий ответ - «проверить дополнительные свойства существующего кода». Более длинный ответ следует.
Я не уверен, что «неявный» против «явный» является хорошей терминологией. Это различие иногда называют «структурным» и «номинальным» подтипом. Тогда есть и второе различие в возможных интерпретациях структурных подтипов (описано ниже). Обратите внимание, что все три интерпретации подтипов действительно ортогональны, и поэтому не имеет смысла сравнивать их друг с другом, вместо того, чтобы понимать использование каждого из них.
Основное операционное различие в интерпретации отношения структурного подтипа A <: B состоит в том, засвидетельствовано ли оно реальным принуждением с вычислительным контентом (во время выполнения / времени компиляции), или оно может быть засвидетельствовано насильственным принуждением. Если первое, важное теоретическое свойство, которое должно соблюдаться, - это «когерентность», т. Е. Если есть несколько способов показать, что A является субструктурным подтипом B, каждое из сопутствующих приведений должно иметь одинаковое вычислительное содержание.
Ссылка, которую вы дали, похоже, имеет в виду вторую интерпретацию структурного подтипа, где A <: B может быть засвидетельствовано принуждением к идентичности. Это иногда называют «интерпретацией подмножества» подтипов, принимая наивное представление о том, что тип представляет набор значений, и поэтому A <: B на всякий случай, когда каждое значение типа A также является значением типа B. Это также иногда называемый «типизацией уточнения», и хорошая статья для оригинальной мотивации - это « Уточнение типов» Фримена и Пфеннинга для ML . Для более позднего воплощения в F # вы можете прочитать Bengston и др., Типы уточнения для безопасных реализаций., Основная идея состоит в том, чтобы взять существующий язык программирования, который может (или может не иметь) уже иметь типы, но в которых типы не гарантируют всего этого (например, только безопасность памяти), и рассмотреть второй уровень типов, выбирающий подмножества программ с дополнительные, более точные свойства.
(Теперь я бы сказал, что математическая теория, лежащая в основе этой интерпретации подтипирования, все еще не так хорошо понята, как следовало бы, и, возможно, это связано с тем, что ее использование не так широко ценится, как следовало бы. интерпретация типов слишком наивна, и поэтому иногда от нее отказываются, а не уточняют. Для еще одного аргумента, что эта интерпретация подтипов заслуживает большего математического внимания, прочитайте введение к подпространствам Пола Тейлора в книге «Абстрактная каменная двойственность» .)
источник
Этот ответ является своего рода минимальным дополнением к отличному ответу Ноама. Интересным моментом для данных является судьба концепций C ++, которые основывались на попытке объединения номинальных и структурных понятий типа.
Здесь есть отличная рецензия со ссылками на большую часть соответствующей дискуссии: http://bartoszmilewski.wordpress.com/2010/06/24/c-concepts-a-postmortem/
Тем не менее, приведенная выше статья не обсуждает номинальную и структурную проблему в какой-либо глубине. Здесь есть еще одна статья, которая делает: http://nerdland.net/2009/07/alas-concepts-we-hardly-knew-ye/
Ключевым документом, на который указывают оба документа, является «Упрощение использования концепций» Бьярна Страуструпа: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2906.pdf , который входит в практическую проблемы встречаются в некоторой глубине.
В целом дискуссия скорее прагматичная, чем строгая. Тем не менее, это дает хорошее представление о видах компромиссов, связанных с этими вопросами, особенно в контексте большого существующего языка.
источник