2015-06-15 17 views
12

Arka plan: nalgebra kitaplığını kullanıyorum ve çok değişkenli normal dağılımı temsil eden bir yapı oluşturmak istiyorum. numarası ve satır tipi benzersiz bir kare matris türüne göre belirlenir, bu yüzden böyle bir şey yazmak istiyorum:Haskell benzeri işlevsel bağımlılıklar nasıl oluşturabilirim

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

ben Haskell kullanıyordum, ben M ve N ve V arasında işlevsel bağımlılığını belirtmek istiyorum. Bunu Rust'ta yapmanın en iyi yolu nedir?

cevap

8

Haskell'in türleri, fundep'leri ve ilişkili türleri arasındaki ilişkiyi ifade etmek için iki şeyi olsa da, Rust'un yalnızca ikincisi vardır. Rust'taki özellikler, uygulama sahasında somut değerler ile atanmış tip üyeler içerebilir ve derleyici, bunların, özelliğin tür parametrelerinin kombinasyonuyla (Self dahil) benzersiz bir şekilde tanımlandığını düşünür.

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

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

Ve sonra bu özellik şöyle kullanılabilir:: Yani SquareMat özellik böyle tanımlamak gerekir

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

size, iyi, SquareMat sonra kontrol etmezseniz şanstan yoksun - sadece kullanım beyanı alanında, sadece Haskell'deki gibi bir işlevsel bağımlılık tanımlayamazsınız.