निम्न कोड को देखते हुए:
स्थिर सदस्य निजी getIntValue (_map: map & lt; string, Int & gt;) (_key: string) = if (_map.ContainsKey _key) फिर _map। [_key], _map else let i = doSomething () i, अगर i & gt; 0 तब _map.Add (_key, i) अन्य _map स्थिर सदस्य निजी getDataFn & lt; 'T & gt; (_getFn: मानचित्र & lt; स्ट्रिंग, 'T & gt; - & gt; स्ट्रिंग - & gt;' T * मानचित्र & lt; स्ट्रिंग, 'T & gt;) = डेटामैप = रेफ्यूरी Map.empty fun _key - & gt; मान दें, अद्यतित मानचित्र = _getFn! डेटामैप _key डेटामैप: = अपडेट किया गया मैप मान स्थिर सदस्य getIndexNumber = getDataFn & lt; int & gt; GetIntValue
... समारोह परिभाषा की पहली पंक्ति में डेटामाप संदर्भ सेल का मान (यानी मजेदार _key -> ...) getDataFn & lt; 'T> हमेशा खाली है ( यानी डेटामैप.काउंट = 0), चाहे कितनी बार मैं getIndexNumber को कॉल करता हूं।
जाहिर है, मैं डेटामैप की उम्मीद कर रहा हूं जब भी एक गैर-मौजूद कुंजी को getIndexNumber में पारित किया जाता है, लेकिन यह नहीं है हो रहा है।
(पीएस मुझे पता है कि मैं सिर्फ एक शब्दकोश का प्रयोग कर सकता हूं, जो इस बिंदु के बगल में है।)
P>
आपको अनब्लॉक करने के लिए कुछ कोड दिया गया है:
let do Something () = 2 प्रकार फू () = स्थिर सूचक दें = Foo.getDataFn & lt; int & gt; Foo.getIntValue स्थिर सदस्य निजी getIntValue (_map: map & lt; string, int & gt;) (_key: string) = अगर (_map.ContainsKey _key) तब _map। [_key], _map else let i = doSomething () i, अगर i & gt ; 0 तब _map.Add (_key, i) अन्य _map स्थिर सदस्य निजी getDataFn & lt; 'T & gt; (_getFn: मानचित्र & lt; स्ट्रिंग, 'टी & gt; - & gt; स्ट्रिंग - & gt;' T * मानचित्र & lt; स्ट्रिंग, 'T & gt;): (स्ट्रिंग - & gt;' T) = डेटामैप = रेफरी मेप। मुक्ति मज़ा _key - & gt; Printfn "count =% d" (! डेटामैप।) मूल्य मान, अपडेटमैप = _getFn! डेटामैप _key डेटामैप: = अपडेटेडमैप वैल्यू स्थिर सदस्य getIndexNumber = indexer // स्थिर सदस्य getIndexNumber = Foo.getDataFn & lt; int & gt; Foo.getIntValue let r = Foo.getIndexNumber ("foo") printfn "% d" r r2 = Foo.getIndexNumber ("foo") printfn "% d" r2
कुंजी यह है कि getIndexNumber
एक संपत्ति है, जिसे हर बार इसका नाम दिया जाता है, जो हर बार getDataFn
कॉल करने से समाप्त होता है, जो एक ताजा रिफ़ हर बार मैं कॉल
getDataFn
को स्थिर वाला
में ले जाया जाता है, इसलिए इसे केवल एक ही बार कॉल किया जाता है।
यह कोड बहुत ही गैर-मुहावरेदार दिखता है, हालांकि। क्या मैं इस तरह से अधिक कोड का सुझाव दे सकता हूं?
चलो doSomething () = 2 प्रकार StringIndexer () = म्यूटिव मानचित्र दें: मानचित्र & lt; स्ट्रिंग, int & gt; = Map.empty let (s) = printfn "count =% d" map.Count मैच नक्शा दें। कोई नहीं - & gt; Let i = doSomething () मानचित्र & lt; - map.Add (s, i) i | कुछ (आई) - & gt; I सदस्य इस। GetIndexNumber (s) = प्राप्त (एस) दो = नए StringIndexer () let r = सी। GetIndexNumber ("foo") printfn "% d" r r2 = si.GetIndexNumber ("foo") printfn " % D "r2
Comments
Post a Comment