2015-06-15 4 views
12

पृष्ठभूमि: मैं nalgebra लाइब्रेरी का उपयोग कर रहा हूं और मैं एक संरचना बनाना चाहता हूं जो एक बहुविकल्पीय सामान्य वितरण का प्रतिनिधित्व करता है। संख्या और पंक्ति प्रकार विशिष्ट एक वर्ग मैट्रिक्स प्रकार से निर्धारित होता है, इसलिए मैं कुछ इस तरह लिखना चाहते हैं:मैं हास्केल जैसी कार्यात्मक निर्भरताओं को कैसे बना सकता हूं

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

अगर मैं हास्केल उपयोग कर रहा था, मैं M और N और V के बीच एक कार्यात्मक निर्भरता निर्दिष्ट करना होगा। जंग में ऐसा करने का सबसे अच्छा तरीका क्या है?

उत्तर

8

जबकि हास्केल के पास प्रकार, धन और संबंधित प्रकारों के बीच इस तरह के संबंध व्यक्त करने के लिए दो चीजें हैं, जंग के पास केवल उत्तरार्द्ध है। जंग में लक्षणों में प्रकार के सदस्य हो सकते हैं जिन्हें कार्यान्वयन साइट पर ठोस मूल्यों के साथ सौंपा गया है, और संकलक उन्हें विशेष रूप से विशेषता के प्रकार पैरामीटर (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 को नियंत्रित नहीं करते हैं, अच्छी तरह से है, तो भाग्य से बाहर हो - आप विशेषता उपयोग साइट पर केवल कार्यात्मक निर्भरता को परिभाषित नहीं कर सकते हैं, केवल विशेषता घोषणा साइट पर, जैसे हास्केल में।

संबंधित मुद्दे