q(x) is true for any x of T and q(y) is true for any y of S => S is a subtype of T
Ответ Нет. Это выражение означает, что общий супертип R для S и T может быть определен, и тогда LSP (позор тому, как это имя стало общепринятым) будет выполняться для T->R и S->R.
В теории типов есть типы, которые включают семантику, и есть реализации типов, которые соблюдают семантику, возможно, путем наследования реализаций.
На практике единственный разумный способ указать семантику типа (часть q(x)
) — это реализация, поэтому у нас остаются бессемантические подписи в виде интерфейсов и классы, которые наследуются в целях реализации и реализуют интерфейсы, которые им нравятся, без возможности проверить, правильно ли они это делают.
Исследователи пытались определить формальные языки для указания типов, поэтому инструменты могут проверять, соответствует ли реализация определениям типов, но усилия настолько велики, что было бы неплохо скомпилировать формальный язык в исполняемый код. . Это Уловка-22, и я думаю, что она никогда не разрешится.
Возвращаясь к исходному вопросу, в языках, допускающих то, что сегодня называется «утиным вводом», ответ неразрешим, потому что объект любого типа может быть передан любой функции, и типизация является правильной, если реализованы правильные подписи и результат правильный. Позволь мне объяснить...
В таком языке, как Eiffel, вы можете поставить постусловие на List.append()
, что List.length()
должно увеличиваться после операция. Так работают такие языки, как Perl, JavaScript, Python или даже Java. Это отсутствие строгости по типам позволяет писать гораздо более краткий код, чем могли бы быть более строгие определения типов.
person
Apalala
schedule
13.03.2011