2015-06-15 4 views
12

Hintergrund: Ich verwende die nalgebra Bibliothek und ich möchte eine Struktur erstellen, die eine multivariate Normalverteilung darstellt. Die Anzahl und der Zeilentyp eindeutig durch einen quadratischen Matrix-Typen bestimmt, so mag ich, so etwas schreiben:Wie kann ich Haskell-ähnliche funktionale Abhängigkeiten erstellen

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

Wenn ich Haskell wurde mit, ich eine funktionale Abhängigkeit zwischen M und N und V angeben würde. Was ist der beste Weg, dies in Rust zu tun?

Antwort

8

Während Haskell zwei Dinge hat, um eine solche Beziehung zwischen Typen, Fundeps und zugehörigen Typen auszudrücken, hat Rust nur die letzteren. Merkmale in Rust können Typmember enthalten, denen an der Implementierungsseite konkrete Werte zugewiesen sind, und der Compiler betrachtet sie als eindeutig identifiziert durch die Kombination von Typparametern des Merkmals (einschließlich Self). Sie müssen also SquareMat Eigenschaft wie folgt definieren:

trait SquareMat { 
    type N; 
    type V; 
    ... 
} 

impl SquareMat for SomeStruct { 
    type N = Four; 
    type V = f64; 
    ... 
} 

Und dann kann dieses Merkmal wie folgt verwendet werden:

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

Wenn Sie nicht SquareMat Kontrolle haben, na ja, Sie dann 'Pech gehabt' - Sie können keine funktionale Abhängigkeit auf der Merkmalsnutzungsseite definieren, sondern nur auf der Merkmalsdeklaration, genau wie in Haskell.

Verwandte Themen