Because we can declare types that can slot in any type parameters, that includes type parameters that the types don't actually use. These are called phantom type parameters, or more informally phantom types.
A common use case for phantom types is in a kind of type-safe builder pattern. (The builder pattern is a piece of code that helps us to construct an object according to specific rules.) For example, we might want to construct syntactically valid SQL statements. One way to do that is to have a validator function that takes an input SQL statement and decides whether it follows SQL syntax rules or not at runtime. This function might try to parse the input statement and build an expression tree. If the tree can be built, the statement is valid. Otherwise, it's invalid.
Another way to approach this is to provide a set of functions...