As you say, there's no exhaustiveness check; plus the language won't guarantee that the product types are adhered to. For example, someone might give us `('invoice card-details)` and the language wouldn't complain.
Racket's contract system can help with this; although it's very slow.
Racket's contract system can help with this; although it's very slow.