This is, as I understand it, the core of the proposal.
Right. As I said, that is global analysis, which is highly uncharacteristic of Rust, a language that prides itself in having the signature of a function indicate all that is necessary to decide where it can be used. (which is a useful property that allows for decent error messages. Contrast with C++...)
fn func_1(vec: Vec<f64>) -> Vec<f64> { vec }
fn func_2(vec: Vec<f64>) -> Vec<f64> { vec.into_iter().collect() }
type VecFn = fn(Vec<f64>) -> Vec<f64>;
fn foo() {
let funcs: Vec<VecFn> = vec![func_1 as _, func_2 as _];
// hand off to some crate that accepts `&[fn(Vec<f64>) -> Vec<f64>]`
some_crate::have_some_funcs(&funcs)
}
Now suppose some_crate::have_some_funcs
does what I previously mentioned, supplying a Vec<f64>:my::Hash
and expecting a Vec<f64>:bob::Hash
. Where is the error message now?