All categories are an imperfect depiction of reality. The truth always lies in the concrete.

Create abstractions from the concrete, to the degree they are useful for the task at hand.

Link to original

Abstract vs general

SpecificGeneral
Abstractinterface Stack<T> { push; pop } — hides the implementation of a stack only.interface Monoid<T> { empty; combine } — a very high-level pattern many types fit (strings, numbers, sets…).
Concreteclass IntArrayStack — fixed array stack for int.function sort<T>(xs: T[], cmp) — works for any T, but it’s concretely “arrays + a particular algorithm.”