在 Array1<T> 上创建一个通用方法

Making a method generic over Array1<T>

我有以下 Trait 实现,并希望 unit 通用于 Array1<T>,但未能找到正确的 Trait 边界(尤其是这对我来说似乎微不足道,所有 T 都需要支持基本上是输出T以使函数工作的基本算法。

trait Unit {
    fn unit(&self) -> Array1<f32>;
}

impl Unit for Array1<f32> 
{
    fn unit(&self) -> Array1<f32> {
        self / (self * self).sum().sqrt()
    }
}

编译器建议添加 std::ops::Mul<Output = &ArrayBase<OwnedRepr<T>, Dim<[usize; 1]>>>,但这样做会一遍又一遍地给出相同的错误。

PlayGround

我按照编译器错误消息生成了这个可以编译的通用代码。我不熟悉 ndarray 所以我不知道这是否真的正确。

use std::ops::Mul;
use num_traits::{Zero, real::Real};
use ndarray::prelude::*;

trait Unit {
    type Output;
    fn unit(&self) -> Array1<Self::Output>;
}

impl<T> Unit for Array1<T>
where
    for<'a> &'a Array1<T>: Mul<Output = Array1<T>>,
    T: Real + Clone + Zero + ndarray::ScalarOperand,
{
    type Output = T;
    fn unit(&self) -> Array1<T> {
        self / (self * self).sum().sqrt()
    }
}

请注意 Unit 现在 return 是一个关联类型。如果您希望它始终 return f32 那么您需要要求 T 也可以转换为 f32