Обобщенные функции

Взял рабочую функцию вычисления факториала

fn fact(n:usize) -> usize
{
  let mut out:usize = 1;
  for a in 1..(n+1) 
  {
    out *= a;
  }

и попытался сделать ее обобщенной

fn fact(n:T) -> T
{
  let mut out:T = 1;
  for a in 1..(n+1) 
  {
    out *= a;
  }
  
  return out;
}

Получил ошибку несовместимости типов.
В одном месте наткнулся на указание, что проблемы с обобщенными функциями можно обойти при помощин трейтов (trait), но пока не могу понять каким образом.

Дело в том, что компилятору необходима полная уверенность, что ваш тип T поддерживает операции 1) сложения с интом (ибо вы делаете n+1 ) и 2) *=

В растбуке проводят аналогичную работу, что нужно сейчас сделать вам, чтобы пример заработал

Также советую обратить внимание на крейт num

Спасибо, я уже нашел эти материалы - пытаюсь увязать в одно целое.