Many languages have some form of expressing "user-defined duck typing": defining a type by its behavior, rather than anything about the structure or data of an instance of the type itself. Haskell and Lean have typeclasses. Java, C#, Go, Julia, TypeScript, Idris, and many more have interfaces. Swift has protocols. Rust and Scala have traits. C++ and Nim have concepts. Standard ML, OCaml, and Agda have modules.
All of these allow for expressing about the same thing in their respective implementations. Which of these are exact synonyms? What are differing traits (heh) between these different concepts (heh)? Semantics vary by language, of course: but are there any broadly agreed-upon differences between a "trait" and a "typeclass", for example? Modules (and classes, though classes are often complemented with interfaces instead of allowing multiple inheritance) are more broadly distinct from the others, but what about the others?
I am fairly aware of the specifics in implementation between different languages and am not looking for that as an answer, unless the broad answer to this question is "there are no name-associated conventions" in which case, so be it. (though if someone was particularly inclined to go through and write a comprehensive guide about the differences in individual languages' implementations, that'd certainly also be useful).