Pre-RFC improved ergonomics for `!`
Rust Internals [Unofficial]
May 19, 2026
I'd expect the mapping to be ! to T for an arbitrary T. () is only mentioned as current convention is generally to use () for situations where ! would be appropriate.
The problem with a trait is that the map_try would need to apply (iteratively) to the outer wrapper(s). impl<T,U> MapTry for T<U> where U: ... isn't valid.
As for why it avoids the mapping problem: The introduction of ! allows for this to happen. Right now moving from an Option<Result<(), E>> to an Option<Result<T, E>> requires you to define some default value to T via nested maps etc. It's clear why that must be the case for (), but ! is clear - this never occurs, so you're only ever going to get None or Some(Err(_))
Discussion in the ATmosphere