this previous answerसही साइड इफेक्ट ऑर्डर के साथ ओकैमल/एफ # में List.map को पुन: कार्यान्वित करना?
के अनुसार आप List.map
इस तरह लागू हो सकते हैं:
let rec map project = function
| [] -> []
| head :: tail ->
project head :: map project tail ;;
लेकिन इसके बजाय, इसे इस तरह कार्यान्वित किया जाता है:
let rec map project = function
| [] -> []
| head :: tail ->
let result = project head in
result :: map project tail ;;
वे कहते हैं कि यह सुनिश्चित करने के लिए इस तरह से किया जाता है अनुमानित क्रम में प्रोजेक्शन फ़ंक्शन को साइड इफेक्ट्स के मामले में बुलाया जाता है, उदाहरण के लिए
map print_int [1;2;3] ;;
123
प्रिंट चाहिए, लेकिन पहले कार्यान्वयन 321
प्रिंट होगा। हालांकि, जब मैं उन दोनों को ओकैमल और एफ # में स्वयं परीक्षण करता हूं, तो वे बिल्कुल उसी 123
परिणाम उत्पन्न करते हैं।
(ध्यान दें कि मैं OCaml और एफ # REPLs में यह परीक्षण कर रहा हूँ - टिप्पणी में निक पता चलता है यह मेरा पुन: पेश करने में असमर्थता का कारण हो सकता है, लेकिन क्यों)
क्या मैं गलत समझ रहा हूँ? क्या कोई विस्तृत कर सकता है क्यों उन्हें विभिन्न ऑर्डर देना चाहिए और मैं पुन: उत्पन्न कैसे कर सकता हूं? यह अतीत में लिखे गए ओकैमल कोड की मेरी पिछली समझ के विपरीत चलता है, इसलिए यह मेरे लिए आश्चर्यजनक था और मैं यह सुनिश्चित करना चाहता हूं कि गलती दोहराना न पड़े। जब मैं दोनों को पढ़ता हूं, तो मैंने इसे एक बाहरी मध्यस्थ बाध्यकारी के साथ बिल्कुल वही चीज़ के रूप में पढ़ा।
मेरा एकमात्र अनुमान यह है कि विपक्ष का उपयोग कर अभिव्यक्ति मूल्यांकन का क्रम छोड़ने का अधिकार है, लेकिन यह बहुत अजीब लगता है?
यह समझने के लिए OCaml कोड निष्पादित अनुसंधान के रूप में विशुद्ध रूप से किया जा रहा है, मैं वास्तव में मेरे अपने उत्पादन कोड List.map
के लिए बनाने की जरूरत नहीं है।
मैं सिर्फ दोनों का परीक्षण किया ओकैमल में 'मानचित्र' के उन कार्यान्वयनों में से क्रमशः आउटपुट के रूप में '321' और' 123' प्राप्त हुआ। क्या आप इन्हें आरईपीएल में चला रहे हैं? –
@NickZuber हाँ मैं हूँ! ओकैमल और एफ # आरईपीएल के साथ-साथ बकलस्क्रिप्ट ऑनलाइन आरईपीएल में परीक्षण किया गया। जब मैं घर जाता हूं तो मैं इसे एक आरईपीएल का उपयोग नहीं करने की कोशिश करूंगा, लेकिन मेरा अगला प्रश्न यह है कि इससे कोई फर्क पड़ता है और फिर भी दोनों बराबर क्यों नहीं हैं :) – jayphelps
ध्यान दें कि 'List.map' का F # कार्यान्वयन FSharp.Core वास्तव में इसे वापस करने से पहले 'सूची' ऑब्जेक्ट बनाने के लिए हुड के नीचे उत्परिवर्तन का उपयोग कर रहा है, इसलिए यह ढेर को ओवरफ़्लो नहीं कर सकता है। ऊपर 'List.map' उदाहरण सभी उदाहरण हैं, और यदि वे उपयोग किए गए थे तो ढेर को ओवरफ़्लो कर देंगे। मुझे नहीं पता कि ओकैमल कार्यान्वयन हुड के तहत क्या कर रहा है, लेकिन यह शायद एक समान चाल का उपयोग करता है ताकि लंबी सूचियों पर ढेर को ओवरफ्लो न किया जा सके। आप लगभग निश्चित रूप से इसे पहले से ही जानते हैं, @ जेप्लेप्स, लेकिन मैंने सोचा कि यह किसी और के लिए उल्लेखनीय है जो बाद में इस प्रश्न में आ सकता है। – rmunn