2009-05-11 11 views
6

मैं अपनी किताबों के माध्यम से रहा हूं, और जब तक मैं खोज शब्द से बाहर नहीं चला जाता, तब तक मैं गुम हो गया हूं, फिर भी मुझे इस समस्या का कोई उदाहरण या उत्तर नहीं मिल रहा है:कोई एफ # प्रकार संदर्भ त्रुटियों को कैसे हल करता है?

निम्न कोड संकलित नहीं करता है क्योंकि एंटीटी घोषित होने पर प्रकार प्रभाव और प्रकार का प्रभाव घोषित नहीं किया गया है। तो मुझे समझ में नहीं आता कि यह कैसे काम करता है।

सी ++ में, यह समस्या एच फाइलों में प्रोटोटाइप घोषणा के माध्यम से हल की जाती है और फिर एच फ़ाइल सहित। सी # में यह कभी भी एक मुद्दा नहीं है। तो यह एफ # में कैसे हल किया जाता है?

#light 
type Entity = 
    { 
     Name:string; 
     Affects:List<Affect>; //Compile error: The type Affect is not defined 
     Effects:List<Effect>; //Compile error: the type Effect is not defined 
    } 

type Effect = 
    { 
     Name:string; 
     //A function pointer for a method that takes an Entity and returns an Entity 
     ApplyEffect:Entity -> Entity; 
    } 

type Affect = 
    { 
     Name:string; 
     //A List of Effects that are applied by this Affect Object 
     EffectList:List<Effect>; 
     //A function pointer to return an Entity modified by the listed Effects 
     ApplyAffect:Entity->Entity; 
    } 

अंतर्निहित यहाँ लक्ष्य है कि प्रकार इकाई की एक वस्तु सूची को प्रभावित करता है यह प्रकार इकाई की वस्तुओं के लिए आवेदन कर सकते हैं सक्षम होना चाहिए है। इकाई उस प्रभाव को भी सूचीबद्ध कर सकती है जो इसे लागू किया गया है। इस तरह एक इकाई की "वर्तमान" स्थिति मूल इकाई स्थिति के खिलाफ सभी प्रभावों को तब्दील करके पाई जाती है।

अपने समय के लिए धन्यवाद,

--Adam लेंडा

+0

देखें http://stackoverflow.com/questions/680606/f-how-to-have-two-methods-calling-each-other wh ich दिखाता है कि पारस्परिक रूप से पुनरावर्ती कार्यों के साथ-साथ पारस्परिक रूप से पुनरावर्ती प्रकारों को परिभाषित करने के लिए कैसे। – Brian

उत्तर

13

मेरा मानना ​​है कि यह सही जवाब है:

http://langexplr.blogspot.com/2008/02/defining-mutually-recursive-classes-in.html

तो

...

type Entity = 
    { 
     Name:string; 
     Affects:List<Affect>; 
     Effects:List<Effect>; 
    } 
and Effect = 
    { 
     Name:string; 
     ApplyEffect:Entity -> Entity; 
    } 
and Affect = 
    { 
     Name:string; 
     EffectList:List<Effect>; 
     ApplyAffect:Entity->Entity; 
    } 
+0

युप - यही वह है जो मैं पोस्ट करने वाला था, अब मुझे यह मिल जाएगा। "असली दुनिया के लिए कार्यात्मक प्रोग्रामिंग" में अध्याय 8 :) –

+0

अध्याय 3, 'विशेषज्ञ एफ #' –

+0

एचआरएमएम का पृष्ठ 67 ... मैं एक ही चीज़ पोस्ट करने वाला था, लेकिन निष्कर्ष निकाला कि संकलक त्रुटि प्राप्त करने के बाद यह संभव नहीं था ! बाहर निकलता है मुझे अभी वाक्यविन्यास थोड़ा गलत मिला है। – Noldorin

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