背景:我正在使用nalgebra库,我想创建一个代表多元正态分布的 struct .数字和行类型由正方形矩阵类型唯一确定,所以我想写以下内容:

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

如果我使用Haskell,我会指定一个介于MNV之间的函数依赖关系.在 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中一样.

Rust相关问答推荐

如何创建引用构造函数拥有的变量的对象?

使用模块中的所有模块,但不包括特定模块

如何在Bevy/Rapier3D中获得碰撞机的计算质量?

你是如何在铁 rust 一侧的金牛座获得应用程序版本的?

在本例中,为什么我不能一次多次borrow 可变变量?

如何将单个 struct 实例与插入器一起传递到Rust中的映射

铁 rust 中双倍或更多换行符的更好练习?

允许 rust 迹 struct 条目具有多种类型

返回Result<;(),框<;dyn错误>>;工作

什么是`&;[][..]`铁 rust 里的刻薄?

如何正确使用git2::Remote::push?

为什么这个闭包没有实现Fn?

在构建器模式中捕获 &str 时如何使用生命周期?

以 `static` 为前缀的闭包是什么意思?我什么时候使用它?

为什么在 macOS / iOS 上切换 WiFi 网络时 reqwest 响应会挂起?

使用部分键从 Hashmap 中检索值

BigUint 二进制补码

如何在 Rust 的内置函数上实现特征?

在 macro_rules 中转义 $ 美元符号

来自外部函数的future 内部可变引用