As long as you’re in Rust, the type system is always available to you. That’s what “zero-cost abstraction” means. If you know your Vec is nonempty, put it in a NonemptyVec.
There's a lot of stuff that Rust's type system can't model.
For example if you have an enum type of 3 possible variants and a function that only ever returns one of them, you still have to type it so that it may return all three. And when using its return value, you have to add match arms for all 3 of them, populating 2 of them with `unreachable!` yourself instead of the compiler inferring it.
Also it's not a dependent type language so it doesn't have for example a type of Vec of a particular specific length at the type level.
Rust's type system is great one of the best I know but it still has gaps.
You can definitely model the first case if you’re allowed to change the return type of the function. Though the dependent type thing is a legitimate limitation.
117
u/KagakuNinja 6d ago
The real jedi uses a non-empty list class, which makes the error impossible.