I was under the impression that this is something you get for free with Hindley-Millner: There is nothing in there that says: This works only for parameters. As long as there are enough hints left so the compiler can find exactly 1 correct type, the inference will work.<p>To rephrase this: Some languages have syntax for calling functions like this:<p><pre><code> returned=function(arg1,arg2)
</code></pre>
and some have it like this:<p><pre><code> function(arg1 in,arg2 in,returned out)
</code></pre>
You can mechanically transform between these 2 styles. The second style works with argument-only type inference, so the compiler has no reason to have problems with the first style.<p>Update: I played around with it - see <a href="https://godbolt.org/z/nfjz8hKa8" rel="nofollow">https://godbolt.org/z/nfjz8hKa8</a><p>I added a trait User with D6->i32 and D8->u8 implementations, and then this:<p><pre><code> let temp=Die::roll();
let _:u8=User::user(temp);
</code></pre>
The compiler can first decide which impl of User to use from the u8, namely the D8. This means it has to use the D8 variant of Die::roll. This compiles, even if the type of temp was never explicitly specified.<p>This means rustc is even more powerfull than the article implies. When using collect the type definition is <i>not</i> necessary, as long as the function contains enough hints to infer it.