3 ms·
If I understood `abort` semantics correctly, it has a type of `never` or Rust's `!`. Which has a meaning "unobtainable value because control flow went somwhere
by ivanjermakov 1y ago
If I understood `abort` semantics correctly, it has a type of `never` or Rust's `!`. Which has a meaning "unobtainable value because control flow went somwhere else". `void` is closer to `unit` or `()` because it's the type with no allowed values.
Cool trick: some languages (e.g. TypeScript) allow `void` generics making parameters of that type optional.
- steveklabnik 1y agoUnit has exactly one allowed value.
- ivanjermakov 1y agoRight, but there is not much semantic difference in having one or having zero allowed values.
- NobodyNada 1y agoThere's a huge semantic difference: a type with zero allowed values can never be constructed. This means that a function that returns an uninhabited type is statically known to not return -- since there's no way it could construct an uninhabited value for a return expression. It also means you can coerce a value of uninhabited type into any other type, because any code which recieves a value of an uninhabited type must be unreachable. For instance, in Rust you can write the following: let weekday_name: &str = match weekday_number { 1 => "Sunday", 2 => "Monday", 3 => "Tuesday", 4 => "Wednesday", 5 => "Thursday", 6 => "Friday", 7 => "Saturday", i => panic!("invalid weekday number: {i}); }; Because panic! aborts the program and doesn't return, its return type is uninhabited. Thus, a panic! can be used in a context where a string is expected.
- ivanjermakov 1y agoWe were talking about `void`, not `!`. It's clear that "never" type has a special language support. Difference between `void` and `()` is much less subtle.
- steveklabnik 1y agoOne vs zero is an incredibly fundamental difference.