【发布时间】:2015-02-20 06:24:23
【问题描述】:
我原以为下面的代码会起作用:
use std::num::{Num};
use std::fmt::{Show};
pub type GradFn<T : Num> = for<'a> fn(&'a [T]) -> (T, Vec<T>);
fn minimize<T : Show, F>(f : GradFn<T>, x0 : &[T]) {
// some no-op to test types
print!("{}",f(x0))
}
fn main() {
let xSquared : GradFn<f64> = |x : &[f64]| -> (f64, Vec<f64>) {
return (x[0] * x[0], vec![2.0 * x[0]]);
};
let (fx, grad) = xSquared(vec![2.0f64].as_slice());
print!("{}", fx);
}
但我遇到了编译器错误(请参阅here):
<anon>:12:32: 14:4 error: mismatched types: expected `fn(&'a [f64]) -> (f64, collections::vec::Vec<f64>)`, found `|&[f64]| -> (f64, collections::vec::Vec<f64>)` (expected extern fn, found fn)
<anon>:12 let xSquared : GradFn<f64> = |x : &[f64]| -> (f64, Vec<f64>) {
<anon>:13 return (x[0] * x[0], vec![2.0 * x[0]]);
<anon>:14 };
【问题讨论】:
-
我不是这方面的专家,但我觉得对你想要达到的目标进行更多解释会对那些可能能够回答的人有所帮助。
-
我正在尝试为函数指针类型设置类型别名并在函数的参数中使用它。下面的答案有效,但在我的实际应用中,我将执行许多使用相同函数签名的函数,并且重复完整类型似乎很乏味。