繁体   English   中英

我可以有可选的特征范围吗?

[英]Can I have optional trait bounds?

给定一个模拟条件概率分布的特征:

trait Distribution {
    type T;
    fn sample<U>(&self, x: U) -> Self::T;
}

我想为两种结构(分别为标量和向量值分布建模)的ConditionalNormalMultivariateConditionalNormal实施特征。

这样的实现如下所示:

struct ConditionalNormal;

impl Distribution for ConditionalNormal {
    type T = f64;

    fn sample<U>(&self, x: U) -> Self::T {
        0.0
    }
}

struct MultivariateConditionalNormal;

impl Distribution for MultivariateConditionalNormal {
    type T = f64;

    fn sample<U>(&self, x: U) -> Self::T {
        0.0 + x[0]
    }
}

游乐场

但是, MultivariateConditionalNormal的实现无效,因为通用x[0]不可索引。 如果我添加特征边界std::ops::Index<usize> ,则ConditionalNormal的实现无效,因为标量f64不可索引。

我听说,例如Sized特质通过?Sized接受可选的特征范围; 我可以做类似的事情吗? 有什么办法解决这个问题?

您可以将特征的定义更改为

trait Distribution<U> {
    type T;
    fn sample(&self, x: U) -> Self::T;
}

这使您可以在具有不同特征范围的各种类型上实现它。

impl<U> Distribution<U> for ConditionalNormal {
    // ...
}

impl<U> Distribution<U> for MultivariateConditionalNormal
where
    U: std::ops::Index<usize, Output = f64>,
{
    // ...
}

操场

您可以添加一个新特征来指定U的功能:

trait Distribution {
    type T;
    fn sample<U>(&self, x: U) -> Self::T
    where
        U: Samplable;
}

struct ConditionalNormal;

impl Distribution for ConditionalNormal {
    type T = f64;

    fn sample<U>(&self, x: U) -> Self::T
    where
        U: Samplable,
    {
        0.0.value()
    }
}

struct MultivariateConditionalNormal;

impl Distribution for MultivariateConditionalNormal {
    type T = f64;

    fn sample<U>(&self, x: U) -> Self::T
    where
        U: Samplable,
    {
        0.0 + x.value()
    }
}

trait Samplable {
    fn value(&self) -> f64;
}

impl Samplable for f64 {
    fn value(&self) -> f64 {
        *self
    }
}

impl Samplable for Vec<f64> {
    fn value(&self) -> f64 {
        self[0]
    }
}

fn main() {}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM