我正在尝试在Rust中编写一些通用的数学函数,但我一直遇到以下错误信息:
error: conflicting implementations for trait SoAndSo
是否可能解决这个问题?如果可以,如何解决?
例如,我试图编写一个通用的点积函数,它接受两个迭代器,将它们压缩,并迭代每对元素以累加乘积。我希望这个函数也能够计算复数点积。复数点积涉及共轭左侧一项。我的第一个想法是编写一个名为Dot1
的特质,用于替换Mul
,使其也共轭左侧参数。以下是完整代码:
extern crate num;
use num::complex::Complex;
use num::{Float, Num};
trait Dot1<Rhs, Result> {
fn dot1(&self, rhs: Rhs) -> Result;
}
impl<T: Float> Dot1<T, T> for T {
// conjugation for reals is a no-op
fn dot1(&self, rhs: T) -> T {
*self * rhs
}
}
impl<T: Num + Clone> Dot1<Complex<T>, Complex<T>> for Complex<T> {
fn dot1(&self, rhs: Complex<T>) -> Complex<T> {
self.conj() * rhs
}
}
fn main() {
println!("Hello, world!")
}
由于Complex<T>
不是Float
,因此两者之间不应有重叠,“通用实现”也应如此。我并未预料到任何问题,但每次我尝试为特质提供多个“通用实现”时,编译器都不喜欢它:
error[E0119]: conflicting implementations of trait `Dot1<num::Complex<_>, num::Complex<_>>` for type `num::Complex<_>`:
--> src/main.rs:17:1
|
10 | impl<T: Float> Dot1<T, T> for T {
| ------------------------------- first implementation here
...
17 | impl<T: Num + Clone> Dot1<Complex<T>, Complex<T>> for Complex<T> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `num::Complex<_>`
|
= note: upstream crates may add new impl of trait `num::Float` for type `num::Complex<_>` in future versions
我如何编写一个通用的、基于迭代器的点积算法,既适用于实数也适用于复数?取出迭代器、压缩它们等操作都不是问题,我甚至能够确定哪些类型参数与哪些边界一起使用。但我似乎无法使用像上面那样的特性“统一”某些数据类型。