Modules in OCaml
Type classes in Haskell
C++0x "concepts" (axed from the specification, but you can do generic programming with templates)
And many more.
Consider a max function that returns the largest of two entities by using a "compare" function.
In Python/C++ Templates you must:
1. Have a compare method in your class
2. Call compare in max.
In Go you must: 1. Have a compare method for your type
2. Call compare in max.
3. Define a Go interface 'Comparable' with the compare function
4. Declare the args to max to be of type Comparable
In Java (OO Style) you must: 1. Have a compare method in your class
2. Call compare in max.
3. Define an interface Comparable to have a compare method
4. Declare max to take type Comparable
5. Declare that your class, with the comparable method implements Comparable.We now have a number of different ways of articulating abstractions in source code. I suspect there is a mechanical way to transform a design using ADT's to a design using OO with the same dependency graph. We need to characterize the canonical abstraction in the same way we characterize a turing machine.