Я вижу «типизацию утки» скорее как стиль программирования, тогда как «структурная типизация» - это особенность системы типов.
Структурная типизация означает способность системы типов выражать типы, которые включают все значения, которые имеют определенные структурные свойства.
Утиная типизация относится к написанию кода, который просто использует возможности переданных им значений, которые фактически необходимы для выполняемой работы, без наложения каких-либо других ограничений.
Так что я мог бы использовать структурные типы для кодирования в стиле утки, формально объявив мои "типы утки" как структурные типы. Но я также мог бы использовать структурные типы без"выполнения утки". Например, если я пишу интерфейсы для связки связанных функций / методов / процедур / предикатов / классов / чего угодно, объявляя и называя общий структурный тип, а затем используя его везде, очень вероятно, что некоторые из блоков кода не будут нуждаться все признаков структурного типа, и поэтому я излишне ограничил некоторые из них отклонением значений, с которыми они могли бы теоретически работать правильно.
Так что, хотя я могу видеть, как есть общий язык, я не думаю, что типирование утки относится к структурному типированию. Как я думаю о них, типизация утки - это даже не та вещь, которая могла бы включать структурную типизацию, потому что это не одно и то же. Думая о том, что утилитная типизация в динамических языках просто «неявные, непроверенные структурные типы» чего-то не хватает, ИМХО. Duck typing - это стиль кодирования, который вы выбираете или не используете, а не просто техническая особенность языка программирования.
Например, можно использовать isinstance
проверки в Python для имитации ограничений типа "класс или подкласс" в стиле OO. Также можно проверить наличие определенных атрибутов и методов, чтобы имитировать ограничения структурного типа (вы даже можете поместить проверки во внешнюю функцию, таким образом, эффективно получая именованный структурный тип!). Я бы сказал, что ни один из этих вариантов не является примером типизации утки (если только структурные типы не очень хорошо детализированы и не синхронизированы с проверкой кода).