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

时间:2015-06-15 12:31:51

标签: rust

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

#[allow(non_snake_case)]
pub struct Multivar<M: SquareMat<N, V>> {
    μ: V,
    Σ: M,
}

如果我使用的是Haskell,我会在MN以及V之间指定功能依赖关系。什么是Rust中最好的方法?

1 个答案:

答案 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>