type Result = ::std::result::Result; struct Error; trait ForEach { type Input; fn for_each(self, f: F) where F: FnOnce(Self::Input) -> U; } impl ForEach for A { type Input = T; fn for_each(self, f: F) where F: FnOnce(Self::Input) -> U, { todo!() } } struct A(T); fn main() { let a = A(Result::Ok(Result::Ok(()))); //~ ERROR type annotations needed a.for_each(|a: Result<_>| { let f = || match a { Ok(Ok(a)) => {} Ok(Err(a)) => {} Err(a) => {} }; }); }