Я читал, что в Rust очень хороший вывод типов с использованием Hindley-Milner. В Rust также есть изменяемые переменные, и AFAIK должны быть некоторые ограничения, когда алгоритм HM работает с изменчивостью, потому что он может чрезмерно обобщать. Следующий код:
let mut a;
a = 3;
a = 2.5;
Не компилируется, потому что во второй строке было выведено целое число, и значение с плавающей запятой не может быть присвоено целочисленной переменной. Итак, я предполагаю, что для простых переменных, как только выводится неуниверсальный тип, переменная становится монотипом и больше не может быть обобщена.
А как насчет шаблона, такого как Vec? Например этот код:
let mut v;
v = Vec::new();
v.push(3);
v.push(2.3);
Это снова не удается, но снова для последней строки. Это означает, что вторая строка выводит тип частично (Vec), а третья - тип контейнера.
Какое правило? Есть ли что-то вроде ограничения ценности, о котором я не знаю? Или я слишком усложняю, а в Rust гораздо более жесткие правила (например, без обобщений)?