一例はお題スレで出てた答え
https://itest.5ch.net/mevius/test/read.cgi/tech/1668333636/969

このfooという関数の型はこのソースだけでは決定できない
呼び出した側がvec<i8>とかvec<i32>とか呼び出した側の要求に応じて初めて単相型が決まる、その時点で初めてスタックに何がどんな順番で積まれるのかが決まる
なのでこの場合posix標準のライブラリ管理の方式では呼び出し側と呼び出され側を別々に分割コンパイルできない

抜粋 (全角スペース使用)
fn foo(input: u32) -> impl Iterator<Item = u32> {
 let table: Vec<u32> = bits_iter(input)
  .map(|p| 1 << p)
  .collect();
 (0..(1 << table.len())).map(move |bits| {
  bits_iter(bits)
   .map(|p| table[p as usize])
   .sum()
 })
}