में सदस्य प्रकार बनाम पैरामीटर टाइप करें मैं जानना चाहता हूं कि सदस्य प्रकार स्कैला में कैसे काम करते हैं, और मुझे प्रकारों को कैसे जोड़ना चाहिए।स्कैला
एक दृष्टिकोण संबंधित प्रकार को एक प्रकार पैरामीटर बनाना है। इस दृष्टिकोण के फायदे यह है कि मैं इस प्रकार के भिन्नता को निर्धारित कर सकता हूं, और मैं यह सुनिश्चित कर सकता हूं कि उप प्रकार टाइप नहीं बदलता है। नुकसान यह है कि मैं किसी फ़ंक्शन में प्रकार से प्रकार पैरामीटर का अनुमान नहीं लगा सकता।
दूसरा दृष्टिकोण संबंधित प्रकार को दूसरे प्रकार का सदस्य बनाना है, जिसमें समस्या है कि मैं उपप्रकारों के संबंधित प्रकारों पर सीमा निर्धारित नहीं कर सकता हूं और इसलिए, मैं फ़ंक्शन पैरामीटर में प्रकार का उपयोग नहीं कर सकता (जब एक्स: एक्स, एक्स # टी नहीं एक्सटी के साथ किसी भी संबंध में हो सकता है)
एक ठोस उदाहरण होगा:
मैं DFAs के लिए एक विशेषता है (प्रकार पैरामीटर के बिना हो सकता है)
trait DFA[S] { /* S is the type of the symbols in the alphabet */
trait State { def next(x : S); }
/* final type Sigma = S */
}
और मैं दौड़ने के लिए एक फ़ंक्शन बनाना चाहता हूं एक इनपुट अनुक्रम में इस DFA, और मैं चाहता हूँ
- समारोह इनपुट अनुक्रम प्रकार के रूप में कुछ भी
<% Seq[alphabet-type-of-the-dfa]
रखना चाहिए - समारोह फोन करने वाले प्रकार पैरामीटर निर्दिष्ट की जरूरत नहीं है, सभी निष्कर्ष निकाला जा चाहिए
- मैं था कंक्रीट डीएफए प्रकार के साथ फ़ंक्शन को कॉल करने की तरह (लेकिन यदि कोई समाधान है जहां फ़ंक्शन में डीएफए के लिए टाइप पैरामीटर नहीं होगा, तो यह ठीक है)
- वर्णमाला प्रकारों को असंवैधानिक (यानी।
def runDFA[S, D <: DFA[S], SQ <% Seq[S]](d : D)(seq : SQ) = ....
इस काम करता है: चार के लिए और साथ ही के लिए एक अभी तक अज्ञात उपयोगकर्ता परिभाषित वर्ग एक DFA)
- भिन्न अक्षर प्रकार के साथ DFAs उपप्रकार
मैं इस कोशिश की नहीं हैं वहाँ होना चाहिए , टाइप एस को छोड़कर यहां अनुमानित नहीं है, इसलिए मुझे प्रत्येक कॉल साइट पर संपूर्ण प्रकार पैरामीटर सूची लिखनी है।
def runDFA[D <: DFA[S] forSome { type S }, SQ <% Seq[D#Sigma]](... same as above
इस
मैं भी प्रकार पैरामीटर नष्ट कर दिया, एक अमूर्त प्रकार सिग्मा बनाया है और उस प्रकार बंधन की कोशिश की (टाइप करने के लिए डी ??? (यह क्या है?) अमान्य वृत्तीय संदर्भ) काम नहीं किया ठोस कक्षाओं में। runDFA तरह
def runDFA[D <: DFA, SQ <% Seq[D#Sigma]](... same as above
लगेगा लेकिन यह अनिवार्य रूप से की तरह समस्याओं में चलाता है "प्रकार बेमेल: उम्मीद dfa.Sigma
, D#Sigma
मिला"
कोई भी विचार? संकेत दिए गए?
संपादित करें:
जवाब के रूप में संकेत मिलता है वहाँ ऐसा करने का कोई आसान तरीका है, किसी के बारे में अधिक विस्तार से बता सकता है क्यों यह असंभव है और क्या होता है परिवर्तित करने की तो यह काम किया?
कारणों से मैं चाहता हूं कि डीडीएफए एक फ्री फ़ंक्शन (एक विधि नहीं) है, मैं अन्य समान कार्य करता हूं जैसे कि automaton minimization, नियमित भाषा संचालन, एनएफए-टू-डीएफए रूपांतरण, भाषा कारक आदि। और सभी यह एक वर्ग के अंदर ओओ डिजाइन के लगभग किसी भी सिद्धांत के खिलाफ है।
वाह, मैंने सोचा कि आपका मतलब यह है: http://www.huygens-fokker.org/scala/ – MusiGenesis