OCaml

2016-04-20 6 views
5

में रिवर्स ऑर्डर में फ़ंक्शन रिटर्न सूची मैं एक फ़ाइल से कुछ संख्याएं पढ़ना चाहता हूं, उन्हें एक सूची में ले जाना चाहता हूं और अंत में उन्हें स्क्रीन पर प्रदर्शित करना चाहता हूं। numbers.txt में वर्तमान में 2 3 5 7 11 है, हालांकि आउटपुट के रूप में मुझे 11 7 5 3 2 - : unit =()OCaml

ऐसा क्यों हो रहा है?

let rec int_list_from_sb sb n = 
match n with 
| 0 -> []; 
| _ -> (bscanf sb " %d" (fun a -> a))::(int_list_from_sb sb (n - 1));; 

let file_name = open_in "numbers.txt" in 
let sb = Scanning.from_channel file_name in 
let int_list = int_list_from_sb sb 5 in 
List.iter (fun a -> print_int a) int_list;; 

उत्तर

5

तर्कों के मूल्यांकन का आदेश OCaml में निर्दिष्ट नहीं है। तो जब आप f x :: g y करते हैं, तो यह निर्दिष्ट नहीं किया गया है कि f या g पहले कॉल किया जाता है। आपके मामले में रिकर्सिव कॉल को कॉल करने से पहले bscanf पर कॉल किया जाता है, यही कारण है कि आप परिणाम गलत क्रम में प्राप्त करते हैं।

मूल्यांकन-आदेश के मुद्दों को ठीक करने का सामान्य तरीका यह है कि उनके साइड इफेक्ट्स के आदेश के दौरान स्थानीय चरों में तर्क को तर्क में डाल दिया जाए। तो f x :: g y की बजाय, let fx = f x in fx :: g y यदि आप f x के प्रभाव g से पहले होने के प्रभाव चाहते हैं तो आप let fx = f x in fx :: g y करेंगे।

हालांकि अपने मामले में आप सिर्फ bscanf के इस तरह निरंतरता तर्क का उपयोग कर सकते:

bscanf sb " %d" (fun a -> a :: int_list_from_sb sb (n - 1)) 
+0

अगर यह दूसरा समारोह यहां, पुनरावर्ती एक, क्या पूर्णांक है कि प्राप्त करने के लिए होता bscanf चुनता है? –

+0

@power_output क्या होता है कि 'int_list_from_sb 4' मूल्यांकन करता है,' एसबी' से 4 नंबर पढ़ता है और '[7; 5; 3; 2] ', फिर' bscanf sb "% d" (मजेदार ए -> ए) 'मूल्यांकन करता है और '11' देता है और फिर' 11 :: [7; 5; 3; 2] 'मूल्यांकन किया जाता है और रिटर्न '[11; 7; 5; 3; 2] '। – sepp2k

+0

@power_output आप भाग्यशाली हो गए हैं, क्योंकि सिस्टम ने अनुमानित तरीके से स्कैनिंग स्थगित कर दी है। परिणाम (* सिद्धांत रूप में *) और भी दिलचस्प हो सकते हैं, क्योंकि 'एसबी' एक परिवर्तनीय संरचना है: कल्पना करें कि क्या होगा यदि दोनों अभिव्यक्तियों का मूल्यांकन किया गया था, उदाहरण के लिए, बदले में। –