[英]Can I have optional trait bounds?
给定一个模拟条件概率分布的特征:
trait Distribution {
type T;
fn sample<U>(&self, x: U) -> Self::T;
}
我想为两种结构(分别为标量和向量值分布建模)的ConditionalNormal
和MultivariateConditionalNormal
实施特征。
这样的实现如下所示:
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.