Suppose x and y are strings, and the language sees x + y. There are 5 kinds of languages:
- Statically-typed and well-designed: determine at compile time that x and y are strings and produce an error.
- Statically-typed and poorly-designed: determine at compile time that x and y are strings, and select the string concatenation operator for +.
- Dynamically-typed and well-designed: determine at run time that x and y are strings, and produce an exception.
- Dynamically-typed and poorly designed: determine at run time that x and y are strings, and select the string concatenation operator for +.
- Not type-safe: fail to detect that x and y are strings, and add their representations interpreted as numbers.