The ergonomics of treating boolean logical values (classically "true" and "false") specially are, in the eyes of a lot of language designers, worth the cognitive overhead of treating boolean as an exceptional type. It is, ultimately, an aesthetic and design choice, rather than a formal one.
As you note, Rust-without-bool isn't that different from Rust as it exists today. I would propose, however, that it'd be incrementally harder to onboard developers coming from other languages, as a result, and potentially also harder to teach people the language.
Alternately, one could consider Rust-but-with-enumerated-bool:
pub enum Boolean {
False,
True,
}
and redefine operations like ==
to evaluate to this type. That's orthogonal, certainly, in so far as Boolean then becomes structurally similar to any other two-valued enumeration, but it doesn't add anything beyond that that I can see.
ok I just realized that technically nearly all the Rust primitive datatypes are enums
Only in so far as the set of values is both finite and closed. There is a qualitative difference between even a small integer type (u8, say) and most enums - specifically, the integer types have far more values than an enum would be expected to.
You certainly could define
enum UnsignedEight {
U0,
U1,
// … and so on …
U255,
}
and define corresponding operations. You can do that today - in fact, Rust allows the compiler to store such an enum in a u8-sized piece of memory, even. The ergonomics are terrible because enums were never designed to accommodate this kind of use - try defining "add" on top of this enum and you'll likely see why.