Generics 解决特征实现冲突

Generics 解决特征实现冲突,generics,traits,rust,Generics,Traits,Rust,我正在尝试用Rust编写一些通用数学函数,并不断遇到以下错误消息: 错误:trait SoAndSo的实现冲突 有可能解决这个问题吗?如果是,怎么做 例如,我正在尝试编写一个通用的点积,它使用两个迭代器,对它们进行压缩,并对这些迭代器对进行迭代,以累积积。我希望这个函数也能计算复数点积。复数上的点积包括共轭一面。我的第一个想法是为一个二进制函数编写一个traitDot1,以替换Mul,因为它还与左侧参数共轭。以下是完整的代码: extern crate num; use num::compl

我正在尝试用Rust编写一些通用数学函数,并不断遇到以下错误消息:

错误:trait SoAndSo的实现冲突
有可能解决这个问题吗?如果是,怎么做

例如,我正在尝试编写一个通用的点积,它使用两个迭代器,对它们进行压缩,并对这些迭代器对进行迭代,以累积积。我希望这个函数也能计算复数点积。复数上的点积包括共轭一面。我的第一个想法是为一个二进制函数编写一个trait
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
没有实现
Float
。想象一下,如果
Complex
实现了
Float
:要么必须有某种方法来决定使用哪个
impl
,要么重叠的代码必须被取缔。。。但是如果有人只在编译器不知道的其他板条箱中添加复杂的
impl Float

最后一点是关键:与Haskell不同,Rust的设计允许此代码完全正常,没有任何风险,这一切都是因为Rust处理最后一点的方式不同。如果你在一个能看到一种类型
类型
和一种特质
特质
的板条箱里,那么你100%肯定
类型
是否实现了
特质
:Rust没有Haskell的开放世界假设,因为只有当
Trait
Type
位于当前板条箱(编译单元)中时,您才能为Type编写
impl Trait,也就是说,您不能在某个遥远的板条箱中为
Complex
实现
Float


RFC 24(Chris链接到),允许这些通用实现与更具体的实现共存,只要保证实现不重叠。

这在实现时是可能的
复杂的
T
更“专业化”呢?这不算什么吗?对不起,但是又是什么原因导致了这种行为,包括过载解决方案?请帮助C++程序员理解锈蚀设计的选择。例如,您需要有某种方法来解决将哪个
impl
用于
(uint,uint)
给定
impl-Trait for(uint,T)
impl-Trait for(T,uint)
。从哲学上讲,Haskell的系统是类似的,您需要通过语言扩展明确地选择这些类型的
impl
s,但是,那里的主要问题不一定适用于Rust(与本答案中描述的问题相同)。未来(长期)可能会增加某种形式的
impl
特异性。