बच सकता है मैं कोड के इस बिट है:एफ # कोटेशन: चर गुंजाइश
let rec h n z = if n = 0 then z
else <@ (fun x -> %(h (n - 1) <@ x + %z @>)) n @>
http://www.cs.rice.edu/~taha/publications/journal/dspg04a.pdf
में एक MetaOcaml उदाहरण से परिवर्तित पत्र में वहाँ से समझाया गया है कि ऊपर के उदाहरण के साथ निम्न निकलेगा मापदंडों 3
और .<1>.
(MetaOcaml अंकन में):
.<(fun x_1 -> (fun x_2 -> (fun x_3 -> x_3 + (x_2 + (x_1 + 1))) 1) 2) 3>.
आपदेख सकते हैंकी जगह x_1
, x_2
आदि से बदल दी गई है क्योंकि x
अन्यथा को fun
में केवल x
का संदर्भ देगा।
लेकिन एफ # में इसकी अनुमति नहीं है। मुझे संकलन-समय त्रुटि मिलती है: "परिवर्तनीय 'x' उद्धरण में बंधे हुए हैं लेकिन एक स्प्लिस्ड अभिव्यक्ति के हिस्से के रूप में उपयोग किया जाता है। इसकी अनुमति नहीं है क्योंकि यह इसके दायरे से बच सकता है।" तो सवाल यह है कि: यह कैसे बदला जा सकता है ताकि यह संकलित हो और मेटाकैम आउटपुट के समान अर्थपूर्ण हो?
टिप्पणी करने के लिए अद्यतन: मैं वास्तव में उद्धरण का मूल्यांकन करने के लिए पावरपैक का उपयोग करता हूं। लेकिन मुझे नहीं लगता कि इसका इसके साथ कुछ लेना देना है क्योंकि त्रुटि संकलन-समय पर है। अब तक कोटेशन मूल्यांकन मूल्यांकन करता है। हालांकि, मुझे पता है कि यह सबसे कुशल कार्यान्वयन नहीं हो सकता है।
Tomas' जवाब देने के लिए अद्यतन: मैं वास्तव में नहीं x
वैश्विक होना चाहता हूँ, या गुंजाइश से बचने के लिए। लेकिन मैं
let rec h n z = if n = 0 then z
else (fun x -> (h (n - 1) (x + z))) n
के समतुल्य के बराबर है। आपका उत्तर (h 3 <@ 1 @>).Eval() = 4
देता है जहां उपर्युक्त h 3 1 = 7
उत्पन्न करता है। और यहां, मैं जवाब होने के लिए 7
चाहता हूं।
मुझे मेयोकामल नहीं पता, लेकिन ऐसा लगता है कि आप असली एफ # कोड में उद्धरण लैम्ब्डा से एक चर का उपयोग करने की कोशिश कर रहे हैं। कोटेशन वास्तविक एफ # कोड नहीं हैं, और इसी कारण से आप उनका मूल्यांकन भी नहीं कर सकते हैं (LINQ मूल्यांकनकर्ता को छोड़कर, जो सही नहीं है)। –