背景:我正在使用nalgebra
库,我想创建一个代表多元正态分布的 struct .数字和行类型由正方形矩阵类型唯一确定,所以我想写以下内容:
#[allow(non_snake_case)]
pub struct Multivar?<M: SquareMat<N, V>> {
μ: V,
Σ: M,
}
如果我使用Haskell,我会指定一个介于M
到N
和V
之间的函数依赖关系.在 rust 迹斑斑的地方,最好的方法是什么?
背景:我正在使用nalgebra
库,我想创建一个代表多元正态分布的 struct .数字和行类型由正方形矩阵类型唯一确定,所以我想写以下内容:
#[allow(non_snake_case)]
pub struct Multivar?<M: SquareMat<N, V>> {
μ: V,
Σ: M,
}
如果我使用Haskell,我会指定一个介于M
到N
和V
之间的函数依赖关系.在 rust 迹斑斑的地方,最好的方法是什么?
虽然Haskell有两种东西来表达类型之间的这种关系,fundeps和相关类型,但Rust只有后者.Rust中的trait可以包含类型成员,这些成员在实现站点被分配了具体的值,编译器认为它们是由trait的类型参数组合(包括Self
)唯一标识的.所以你需要这样定义SquareMat
个trait :
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
,那么你就不走运了——你不能在trait用法站点定义函数依赖,只能在trait声明站点定义函数依赖,就像在Haskell中一样.