2015-06-15 13 views
12

Contesto: sto utilizzando la libreria nalgebra e voglio creare una struttura che rappresenti una distribuzione normale multivariata. Il numero e il tipo di riga è determinato unicamente da un tipo di matrice quadrata, quindi voglio scrivere qualcosa del genere:Come creare dipendenze funzionali tipo Haskell

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

Se stavo usando Haskell, vorrei specificare una dipendenza funzionale tra M e N e V. Qual è il modo migliore per farlo in Rust?

risposta

8

Mentre Haskell ha due elementi per esprimere tale relazione tra tipi, fondi e tipi associati, Rust ha solo quest'ultimo. I tratti di Rust possono contenere membri di tipo assegnati con valori concreti nel sito di implementazione e il compilatore li considera identificati in modo univoco dalla combinazione di parametri di tipo del tratto (incluso Self). Quindi è necessario definire SquareMat tratto in questo modo:

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

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

E poi questa caratteristica può essere utilizzato in questo modo:

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

Se non si controlla SquareMat, beh, allora si Sei sfortunato: non puoi definire una dipendenza funzionale nel sito di utilizzo dei tratti, solo nel sito della dichiarazione dei tratti, proprio come in Haskell.

Problemi correlati