use std::marker::PhantomData; trait DistributedIterator { fn reduce(self) where Self: Sized, { unreachable!() } } trait DistributedIteratorMulti { type Item; } struct Connect(PhantomData); impl DistributedIteratorMulti<&'a ()>> DistributedIterator for Connect where {} struct Cloned(PhantomData); impl<'a, Source> DistributedIteratorMulti<&'a Source> for Cloned<&'a Source> { type Item = (); } struct Map { i: I, f: F, } impl, F, Source> DistributedIteratorMulti for Map where F: A<>::Item>, { type Item = (); } trait A {} struct X; impl A<()> for X {} fn multi(_reducer: I) where I: for<'a> DistributedIteratorMulti<&'a ()>, { DistributedIterator::reduce(Connect::(PhantomData)) } fn main() { multi(Map { //~ ERROR implementation of `DistributedIteratorMulti` is not general enough i: Cloned(PhantomData), f: X, }); }