 <p>I see "duck typing" more as a programming style, whereas "structural typing" is a type system feature.</p> <p>Structural typing refers to the ability of the type system to <strong>express</strong> types that include all values that have certain structural properties.</p> <p>Duck typing refers to writing code that just uses the features of values that it is passed that are actually needed for the job at hand, without imposing any other constraints.</p> <p>So I could <em>use</em> structural types to code in a duck typing style, by formally declaring my "duck types" as structural types. But I could also use structural types <em>without</em> "doing duck typing". For example, if I write interfaces to a bunch of related functions/methods/procedures/predicates/classes/whatever by declaring and naming a common structural type and then using that everywhere, it's very likely that some of the code units don't need <em>all</em> of the features of the structural type, and so I have unnecessarily constrained some of them to reject values on which they could theoretically work correctly.</p> <p>So while I can see how there is common ground, I don't think duck typing subsumes structural typing. The way I think about them, duck typing isn't even a thing that might have been able to subsume structural typing, because they're not the same kind of thing. Thinking of duck typing in dynamic languages as just "implicit, unchecked structural types" is missing something, IMHO. Duck typing is a coding style you choose to use or not, not just a technical feature of a programming language.</p> <p>For example, it's possible to use <code>isinstance</code> checks in Python to fake OO-style "class-or-subclass" type constraints. It's also possible to check for particular attributes and methods, to fake structural type constraints (you could even put the checks in an external function, thus effectively getting a named structural type!). I would claim that neither of these options is exemplifying duck typing (unless the structural types are quite fine grained and kept in close sync with the code checking for them).</p>