2014-07-24 3 views
5

कोर में, List.find इस प्रकार है, एक सहायक समारोह का उपयोग कर परिभाषित किया गया है:ओकैमल में, कोर की सूची में एक सहायक कार्य क्यों है। ढूँढें?

let find l ~f = 
    let rec find_aux = function 
    | []  -> None 
    | hd :: tl -> if f hd then Some hd else find_aux tl 
    in 
    find_aux l 

लेकिन यह सीधे परिभाषित किया जा सकता। उदाहरण के लिए:

let rec find l ~f = 
    match l with 
    | []  -> None 
    | hd :: tl -> if f hd then Some hd else find tl f 

वहाँ List.find के रूप में एक समारोह में इस तरह परिभाषित करने के लिए एक सहायक समारोह प्रयोग करने में कोई लाभ है?

+0

हास्केल में इस तरह की चीज करके आपको अतिरिक्त इनलाइनिंग अवसर मिलते हैं, यह एक बड़ा सौदा है। मुझे नहीं पता कि ओकैम एक जैसा है या नहीं। खोज शब्द: स्थिर तर्क परिवर्तन, कार्यकर्ता-रैपर परिवर्तन –

उत्तर

5

इस मामले में, यह बहुत बदल नहीं है, क्योंकि दोनों कार्यों पूंछ पुनरावर्ती हैं, लेकिन अभी भी, आपके सवाल का जवाब है:

find बुला दो तर्क गुजर की आवश्यकता है। find_aux पर कॉल करने के लिए एक तर्क पारित करने की आवश्यकता है। तर्कों को पास करना मुफ़्त नहीं है: वे स्टैक पर स्थान लेते हैं, अधिकतम फ़ंक्शन गहराई को सीमित करते हैं यदि फ़ंक्शन पूंछ-रिकर्सिव नहीं है, और वे सेट अप करने में समय लेते हैं।

यह एक व्यापार-बंद है: कोर के संस्करण में, f को अपने (स्थानीय रूप से) स्थायी मूल्य पर बांधने के लिए एक बंद करने के लिए आवंटित किया जाना चाहिए। यदि सूची कम है, तो बंद करने का आवंटन कुछ अतिरिक्त तर्कों को पार करने से अधिक महंगा हो सकता है (esp। क्योंकि फ़ंक्शन पूंछ-पुनरावर्ती है)।

असल में, आपको इसके बारे में चिंता नहीं करनी चाहिए। यह शायद इस मामले में अनावश्यक है, और यहां तक ​​कि जब यह अनावश्यक नहीं है, यह कोई बड़ा अंतर नहीं बनाता है।

+0

बहुत संक्षिप्त लेकिन पूर्ण उत्तर। जानकार अच्छा लगा –

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