背景:我正在使用nalgebra
库,我想创建一个表示多元正态分布的结构。数字和行类型由方形矩阵类型唯一确定,所以我想写这样的东西:
#[allow(non_snake_case)]
pub struct Multivar<M: SquareMat<N, V>> {
μ: V,
Σ: M,
}
如果我使用的是Haskell,我会在M
和N
以及V
之间指定功能依赖关系。什么是Rust中最好的方法?
答案 0 :(得分:8)
虽然Haskell有两种表达类型,fundeps和相关类型之间关系的东西,但Rust只有后者。 Rust中的特征可以包含在实现站点上分配了具体值的类型成员,并且编译器认为它们由特征的类型参数(包括Self
)的组合唯一标识。所以你需要像这样定义SquareMat
特征:
trait SquareMat {
type N;
type V;
...
}
impl SquareMat for SomeStruct {
type N = Four;
type V = f64;
...
}
然后这个特性可以像这样使用:
#[allow(non_snake_case)]
pub struct Multivar<M: SquareMat> {
μ: M::V,
Σ: M,
}
如果你不控制SquareMat
,那么你运气不好 - 你不能在特质使用网站上定义功能依赖,只能在特征声明网站上定义,就像在Haskell中一样。 / p>