This passage, which unfortunately lacks references, about the development of ADTs in Haskell, from A History of Haskell: Being Lazy With Class, section 5.1:
In general, an algebraic type specifies a sum of one or more
alternatives, where each alternative is a product of zero or more
fields. It might have been useful to permit a sum of zero
alternatives, which would be a completely empty type, but at the time
the value of such a type was not appreciated.
leaves me wondering, how would such an ADT be useful?
Theoretically: the Curry-Howard isomorphism gives us an interpretation of this type as the “false” proposition. “false” is useful as a proposition on its own; but is also useful for constructing the “not” combinator (as
type Not a = a -> False) and other similar constructions.Pragmatically: this type can be used to prevent certain branches of parameterized data types from coming into existence. For example, I’ve used this in a library for parsing various game trees something like this:
The impact of this is that, when parsing a Lines of Action game tree, if there’s a ruleset specified, we know its constructor will be
Unknown, and can leave other branches off during pattern matches, etc.