如何创建类似Haskell的函数依赖项

yon*_*ong 12 rust

背景:我正在使用该nalgebra库,我想创建一个代表多元正态分布的结构.数字和行类型由方形矩阵类型唯一确定,所以我想写这样的东西:

#[allow(non_snake_case)]
pub struct Multivar<M: SquareMat<N, V>> {
    ?: V,
    ?: M,
}
Run Code Online (Sandbox Code Playgroud)

如果我用Haskell中,我将指定之间的函数依赖MNV.在Rust中最好的方法是什么?

Vla*_*eev 8

虽然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中一样.