We have had a detailed discussion of properties, but haven't mentioned yet where the input data for these properties comes from. Let's correct this omission and give generators the care they deserve.
The idea of the generator comes from the general concept of types. In a sense, a type is a specification of possible values complying to that type. In other words, types describe the rules that values must comply to. These rules give us the possibility to generate ranges of data values for given types.
For some types there are more values; for others, there are less. As we already know, there are literal types which contain a single value. The same applies for Unit type with its () value. For Boolean, there are two values that exist: true and false. Two values would also exist for an imaginary equality relation type—equal and non-equal. With the same principle...