OCaml

2012-04-07 15 views
7

में बहु पैरामीटर समारोह की कमजोर-memoizing परिणाम मैं एक तरह से एक OCaml समारोह f कि (सामान्य रूप में या एक से अधिक,) दो पैरामीटर लेता है के परिणामों memoize करने के लिए देख रहा हूँ। इसके अलावा (और यह मुश्किल हिस्सा है), मैं चाहता हूं कि इस प्रक्रिया को अंतर्निहित नतीजा पूरी तरह से न भूलें यदि दो पैरामीटर के मानों में से कोई भी कचरा एकत्रित होता है।OCaml

एक समारोह है कि ठीक एक तर्क लेता के लिए, यह Weak मॉड्यूल और एक सरल तरीके से अपने Make functor के साथ किया जा सकता है। इसे किसी ऐसे चीज के लिए सामान्यीकृत करने के लिए जो उच्च धर्मार्थ के कार्यों को याद कर सके, एक बेवकूफ समाधान मूल्य मानों के मूल्यों के परिणामस्वरूप कमजोर मानचित्र बनाना है। लेकिन यह कचरा संग्रह के संबंध में सही ढंग से काम नहीं करेगा, क्योंकि मूल्यों का ट्यूप केवल ज्ञापन समारोह के दायरे में मौजूद है, न कि क्लाइंट कोड जो f पर कॉल करता है। वास्तव में, कमजोर संदर्भ टुपल के लिए होगा, जो ज्ञापन (सबसे खराब मामले में) के बाद सही कचरा इकट्ठा किया जा रहा है।

वहाँ फिर से लागू करने Weak.Make बिना यह करने के लिए कोई तरीका है?

हैश-consing मेरी जरूरतों के orthogonal है और, वास्तव में मेरी मूल्यों के लिए वास्तव में वांछनीय नहीं है,।

धन्यवाद!

उत्तर

3
अनुक्रमण के बजाय

tuples द्वारा आप एक वृक्ष संरचना हो सकता था। आपके पास पहले फंक्शन पैरामीटर द्वारा अनुक्रमित एक कमजोर तालिका होगी, जिनकी प्रविष्टियां माध्यमिक कमजोर टेबल हैं। द्वितीयक तालिकाओं को दूसरे फ़ंक्शन पैरामीटर द्वारा अनुक्रमित किया जाएगा और ज्ञात परिणाम शामिल होंगे। जैसे ही फ़ंक्शन पैरामीटर जीसीड होता है, यह संरचना ज्ञापन फ़ंक्शन परिणामों को भूल जाएगी। हालांकि, द्वितीयक तालिकाओं को तब तक बनाए रखा जाएगा जब तक कि पहला फ़ंक्शन पैरामीटर लाइव न हो। आपके फ़ंक्शन परिणामों के आकार और विभिन्न पहले पैरामीटर के वितरण के आधार पर, यह एक उचित व्यापारिक हो सकता है।

मैंने इसका परीक्षण नहीं किया है, या तो। यह भी उचित रूप से स्पष्ट लगता है।

+0

मैं देख सकता हूं कि पहले पैरामीटर मान का कचरा संग्रह दूसरे पैरामीटर के लिए संबंधित तालिका को मुक्त करने के परिणामस्वरूप होगा।हालांकि, दूसरे पैरामीटर के लिए तालिका में एक मान जीसीइंग अपने माता-पिता के लिए कुछ भी नहीं करता है (यदि 'वीक' मॉड्यूल का उपयोग किया जाता है), भले ही परिणामस्वरूप नक्शा खाली हो। बेशक यह मानचित्र की सामग्रियों को सक्रिय रूप से स्कैन करके और खाली तालिकाओं पर मैप करने वाली पहली पैरामीटर कुंजियों को हटाकर किया जा सकता है। – Nikos

+0

ठीक है, जैसा कि मैंने कहा था कि द्वितीयक तालिका तब तक एकत्र नहीं की जाएगी जब तक कि पहला पैरामीटर मुक्त न हो जाए। लेकिन ज्ञात वापसी मूल्य एकत्र किया जाएगा (यह मुझे लगता है)। –

3

एक विचार अपनी खुद की कचरा संग्रहण प्रदर्शन करने के लिए है।

सरलता के लिए, मान लेते हैं कि सभी तर्क एक ही प्रकार k डालते हैं।

k * k द्वारा ज्ञात ज्ञात परिणामों वाले मुख्य कमजोर तालिका के अलावा, k प्रकार के एकल तर्क वाले द्वितीयक कमजोर तालिका बनाएं। विचार एक समय में मुख्य तालिका को स्कैन करना और बाइंडिंग को हटाने के लिए है जो अब नहीं चाहते थे। यह द्वितीयक तालिका में तर्कों को देखकर किया जाता है; तो यदि उनमें से कोई भी चला गया है तो आप मुख्य तालिका से बाध्यकारी को हटा दें।

(अस्वीकरण: मैं इस परीक्षण नहीं किया है, यह काम कर सकते हैं नहीं या वहाँ बेहतर समाधान हो सकता है)

+0

अच्छा बिंदु। शायद केवल एक टेबल की आवश्यकता होती है, जिसमें कुंजियों के रूप में कमजोर संदर्भों के tuples होते हैं और जो कि कस्टम कचरा गायब हो जाता है, जब भी कुंजी टुपल में कोई कमजोर संदर्भ गायब हो जाता है। क्या यह अंतिमकर्ताओं के माध्यम से किया जा सकता है? – Nikos

1

मैं जानता हूँ कि यह एक पुराने सवाल है, लेकिन अपने सहयोगियों ने हाल ही में एक वृद्धिशील गणना पुस्तकालय, Adapton कहा जाता है, कि यह कार्यक्षमता संभाल कर सकते हैं विकसित किया है। आप कोड here पा सकते हैं। आप शायद LazySABidi मज़ेदार का उपयोग करना चाहते हैं (अन्य बेंचमार्किंग के लिए हैं)। पुस्तकालय का उपयोग करने के उदाहरणों के उदाहरण के लिए आप अनुप्रयोग फ़ोल्डर में देख सकते हैं। यदि आपको और प्रश्न पूछने हों तो मुझे बता दें।