2014-12-14 4 views
5

मैं एफ # में एक चक्रीय ग्राफ करने के लिएएफ # में चक्रीय ग्राफ बनाना। क्या उत्परिवर्तन की आवश्यकता है?</p> <pre><code>type Node = { Value : int; Edges : Node list } </code></pre> <p>मेरा प्रश्न है:

मेरे नोड प्रकार कुछ इस तरह दिखता कोशिश कर रहा हूँ मैं आदेश चक्र करने के लिए किनारों परिवर्तनशील बनाने की जरूरत है?

उत्तर

7

एफ # चक्रों के साथ तत्काल रिकर्सिव ऑब्जेक्ट संदर्भ बनाना संभव बनाता है, लेकिन यह वास्तव में केवल (काफी सरल) रिकॉर्ड पर काम करता है। इसलिए, यदि आप अपनी परिभाषा पर इस कोशिश यह काम नहीं करेगा:

let rec loop = 
    { Value = 0; 
    Edges = [loop] } 

हालांकि, अगर आप अभी भी उत्परिवर्तन से बच सकते हैं - एक उचित विकल्प आलसी मूल्यों का उपयोग करने के लिए है:

type Node = { Value : int; Edges : Lazy<Node list>} 

इस तरह, आप संकलक "पर्याप्त समय" दे रहे हैं एक loop मान बनाने के लिए इससे पहले कि यह किनारों का मूल्यांकन करने की जरूरत है (और फिर loop मूल्य का उपयोग):

let rec loop = 
    { Value = 0; 
    Edges = lazy [loop] } 

prac में टाइस, आप शायद किनारों को बनाने के लिए कुछ फ़ंक्शंस कॉल करना चाहते हैं, लेकिन यह भी काम करना चाहिए। आपको लिखने में सक्षम होना चाहिए Edges = lazy (someFancyFunction loop)

वैकल्पिक रूप से, आप seq<Edges> (जैसे अनुक्रम डिफ़ॉल्ट रूप से आलसी हैं) का उपयोग कर सकते हैं, लेकिन यह हर बार किनारों का फिर से मूल्यांकन करेगा, इसलिए आप शायद ऐसा नहीं करना चाहते हैं।

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