>>55
ご指摘ありがとうございます
変数名を英語やローマ字にしてもわかりにくかったため日本語にしました
あとは無駄な部分を整理した結果シンプルになりました

fn 素数列<T>() -> impl Iterator<Item=T>
 where T: Copy + num::One + num::CheckedAdd + std::cmp::PartialOrd,
{
 range(T::one(), |_| true)
 .filter(|&素数|
  range(T::one(), |約数| 約数 < 素数)
  .all(|約数|
   range(約数, |約数倍数| 約数倍数 <= 素数)
   .all(|約数倍数| 約数倍数 != 素数)))
}

fn range<T>(unit: T, cond: impl Fn(T) -> bool) -> impl Iterator<Item=T>
 where T: Copy + num::CheckedAdd,
{
 itertools::unfold(unit, move |x| {
  *x = x.checked_add(&unit)?;
  cond(*x).then(|| *x)
 })
}

fn main() {
 itertools::assert_equal(素数列::<i8>(),
  [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127]);
 assert_eq!(素数列::<u8>().last(), Some(251));
}
コードが汚いとご批判くださっていた皆さま方
これでいかがでしょうか?