やろうとしていること
Rust で Python で使うようのコードを書いています。Python で使うときに配列の中身は整数型でも浮動小数点数でも良いようにしたいのでジェネリクスを使って対応させようとしています。
rust
1use pyo3::prelude::*; 2use pyo3::wrap_pyfunction; 3 4use num_traits::{NumAssign, NumCast}; 5 6#[pymodule] 7fn pykk(_py: Python, m: &PyModule) -> PyResult<()> { 8 m.add_wrapped(wrap_pyfunction!(imag2real))?; 9 Ok(()) 10} 11 12#[pyfunction] 13fn imag2real<T>(x: Vec<T>, y: Vec<T>) -> PyResult<Vec<f64>> 14where 15 T: NumAssign + NumCast + Copy 16{ 17 const PI: f64 = 3.141592653589; 18 let mut result = vec![0.0; y.len()]; 19 20 for i in 0..x.len() { 21 result[i] = 2.0 / PI * integrate(&x, &y, i); 22 } 23 24 Ok(result) 25}
forループの中に出てきている integrate(&x, &y, i)
という関数は以下のような入出力をもっています。
rust
1fn integrate<T>(x: &Vec<T>, y: &Vec<T>, num: usize) -> f64;
T
は上の img2real
で定めているものと同じように定義しています。
生じている問題
上のコードをビルドすると下のようなエラーが生じます。
bash
1error[E0283]: type annotations needed for `Vec<T>` 2 --> src/lib.rs:26:4 3 | 425 | #[pyfunction] 5 | ------------- consider giving `arg0` the explicit type `Vec<T>`, where the type parameter `T` is specified 626 | fn imag2real<T>(x: Vec<T>, y: Vec<T>) -> PyResult<Vec<f64>> 7 | ^^^^^^^^^ 8 | | 9 | cannot infer type for type parameter `T` declared on the function `imag2real` 10 | required by a bound in this 1127 | where 1228 | T: NumAssign + NumCast + Copy 13 | --------- required by this bound in `imag2real` 14 | 15 = note: cannot satisfy `_: NumAssign` 16help: consider specifying the type argument in the function call 17 | 1826 | fn imag2real::<T><T>(x: Vec<T>, y: Vec<T>) -> PyResult<Vec<f64>> 19 | ^^^^^
このエラーが言っていることは
Vec<T>
に型アノテーションをつけろT
を型推論出来ない
ということだと思うのですが、これらをどう解決したらいいのかわかりません。
初歩的な質問かと思いますが、どうぞよろしくお願いいたします。
追記
Cargo.toml
toml
1[package] 2authors = ["xxx xxx"] 3edition = "2018" 4name = "pykk" 5version = "0.1.0" 6 7# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 8 9[lib] 10crate-type = ["cdylib"] 11name = "pykk" 12 13[dependencies.pyo3] 14features = ["extension-module"] 15version = "0.13.2" 16 17[dependencies] 18num-traits = "0.2.14"
関数 integrate
の実装
rust
1fn integrate<T>(x: &Vec<T>, y: &Vec<T>, num: usize) -> f64 2where 3 T: NumAssign + NumCast + Copy, 4{ 5 let mut result = T::from(0.0).unwrap(); 6 let diff = x[1] - x[0]; 7 8 for i in 0..x.len() { 9 if i == num { 10 continue; 11 } 12 result += x[num] * y[i] / (x[i] * x[i] - x[num] * x[num]) * diff; 13 } 14 15 result.to_f64().unwrap() 16}
回答2件
あなたの回答
tips
プレビュー