First of all, you are correct that semantically enum is strictly superior to the struct as to what it can represent, and therefore struct is somewhat redundant.
However, there are other elements at play here.
-
ease of use: the values within an
enumcan only be accessed (directly) through matching; contrast with the ease of use of accessing astructfield. You could write accessors for each and every field, but that is really cumbersome. -
distinction: an
enumis a tagged union, astructhas a fixed-layout; we (programmers) generally like to put labels on things, and therefore giving different names to different functionality can be appreciated.
As I see it, struct is therefore syntactic sugar. I usually prefer lean and mean, but a bit of sugar can go a long way in increasing what can be represented tersely.