मैं ओकैमल नौसिखिया हूं। मैं "हैलो वर्ल्ड" टाइप स्निपेट के साथ खेल रहा हूं और इस स्थिति में आया हूं। यहाँ कुछ अतिरिक्त टिप्पणी के साथ दुभाषिया के साथ एक सत्र है:Printf.printf के साथ यह छोटा ओकैम स्निपेट क्यों नहीं काम करता है?
# let average a b =
(a +. b) /. 2.;;
val average : float -> float -> float = <fun>
# average 1. 4.;;
- : float = 2.5
# string_of_float (average 1. 4.);;
- : string = "2.5"
(* this fails...*)
# let _ = Printf.printf (string_of_float (average 1. 4.));;
Error: This expression has type string but an expression was expected of type
('a, out_channel, unit) format =
('a, out_channel, unit, unit, unit, unit) format6
(* yet this works *)
# "hello!";;
- : string = "hello!"
# let _ = Printf.printf "hello!";;
hello!- : unit =()
(* another failed attempt *)
# let s = string_of_float (average 1. 4.);;
val s : string = "2.5"
# s;;
- : string = "2.5"
# let _ = Printf.printf s;;
Error: This expression has type string but an expression was expected of type
('a, out_channel, unit) format =
('a, out_channel, unit, unit, unit, unit) format6
(* and this also works?? *)
# let _ = Printf.printf "2.5";;
2.5- : unit =()
तो यहाँ की स्थिति है। string_of_float (average 1. 4.)
एक स्ट्रिंग देता है, जैसे "hello!"
करता है। जब मैं "hello!"
Printf.printf
में देता हूं, तो यह अपेक्षित के रूप में काम करता है। जब मैं string_of_float (average 1. 4.)
से Printf.printf
देता हूं तो यह विफल रहता है और बताता है कि मुझे उम्मीद है कि स्ट्रिंग की उम्मीद नहीं है लेकिन वह अन्य अजीब प्रकार है। लेकिन "hello!"
और "2.5"
क्यों काम करते हैं?
क्या चल रहा है?
यह मुझे समझ में आता है। धन्यवाद! – dimatura
रन टाइम पर 'format6' बनाने में सक्षम नहीं है वास्तव में ... कमी है। क्या एक ही लक्ष्य प्राप्त करने के लिए कोई रास्ता है (इसे स्वयं लिखने से छोटा)? (उदाहरण के लिए, आप रनटाइम पर निर्धारित स्पेस की मनमानी संख्या से स्ट्रिंग कैसे पैड करते हैं? सी में हम 'sprintf (sprintf ("%%% डीएस", चौड़ाई), str) ' – kizzx2
@ kizzx2: इस विशेष कार्य के लिए , एक वैकल्पिक समाधान है: प्रारूप स्ट्रिंग सिंटैक्स चौड़ाई या परिशुद्धता को तारांकन द्वारा प्रतिस्थापित करने की अनुमति देता है, इस मामले में यह इसे एक अतिरिक्त तर्क से ले जाएगा जो मुख्य तर्क से पहले है: 'Printf.sprintf"% * s "चौड़ाई str'; यह वाक्यविन्यास सी 99, पर्ल, पायथन, रूबी, गो, आदि में भी उपलब्ध है लेकिन निश्चित रूप से यह केवल एक विशेष मामला है; अन्य चीजों के लिए आप भाग्य से बाहर हो सकते हैं। एक ऑपरेटर '^^' है OCaml प्रारूपों को एक साथ जोड़ने के लिए, लेकिन आपको अभी भी पहले स्थान पर जोड़ने के लिए प्रारूपों की आवश्यकता है, इसलिए मुझे नहीं पता कि यह कितना उपयोगी है। – newacct