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