# Printf.sprintf (if true then "%d" else "%d ") 2;;
Error: This expression has type string but an expression was expected of type
('a -> 'b, unit, string) format =
('a -> 'b, unit, string, string, string, string) format6
(* define a type abbreviation for brevity *)
# type ('a,'b) fformat = ('a ->'b, unit, string) format;;
type ('a, 'b) fformat = ('a -> 'b, unit, string) format
# Printf.sprintf (if true then ("%d":('a,'b)fformat) else ("%d ":('a,'b)fformat)) 2;;
- : string = "2"
OCaml प्रणाली पहचान नहीं कर सकते कि if ... then "a" else "b"
BLAHBLAH format
लिए डाली जा सकता है:
यहाँ एक और उदाहरण है। यदि आपने प्रत्येक शाब्दिक स्ट्रिंग को BLAHBLAH format
पर डाला है, तो सब कुछ काम करता है। (नोट: यदि आप, BLAHBLAH format
करने के लिए पूरे if/then/else
कास्ट करने के लिए के बाद से OCaml सत्यापित नहीं कर सकता है कि आपके स्ट्रिंग एक शाब्दिक है की कोशिश यह काम नहीं करता।)
समस्या के मूल प्रकार सुरक्षा की आवश्यकता है: OCaml कि आवश्यकता है वहाँ प्रत्येक %d
और %s
इत्यादि के लिए सही प्रकार का तर्क है, और संकलन समय पर इसकी गारंटी देता है। आप Printf
के साथ टाइप सुरक्षा की गारंटी नहीं दे सकते हैं जब तक कि संपूर्ण प्रारूप स्ट्रिंग संकलित समय पर ज्ञात न हो। इसलिए, एक जटिल एल्गोरिदम के माध्यम से गणना की गई प्रारूप स्ट्रिंग के साथ Printf
का उपयोग करना असंभव है, उदाहरण के लिए, यादृच्छिक रूप से %s
और %d
चुनकर।
जब हम प्रारूप स्ट्रिंग की गणना करने के लिए if/then/else
का उपयोग करते हैं, तो ओकैम चीजें, ओह जी, यह एक जटिल एल्गोरिदम है, और यह संकलन समय पर प्रकार की सुरक्षा को सत्यापित करने के लिए निराशाजनक है। ^^
ऑपरेटर BLAHBLAH format
प्रकारों के बारे में जानता है और प्रारूप स्ट्रिंग को संयोजित करते समय सही परिणाम उत्पन्न करता है।लेकिन if/then/else
को BLAHBLAH format
के बारे में पता नहीं है, और if/then/else
पर कोई अंतर्निहित विकल्प नहीं है (लेकिन मुझे लगता है कि आप स्वयं ऐसी चीज को परिभाषित कर सकते हैं)।
एक बढ़िया स्पष्टीकरण, धन्यवाद। एक मामूली बात, मुझे आपका फॉर्मूलेशन मिल गया है "(^^) ऑपरेटर एक टाइपिंग संदर्भ बनाता है .." अस्पष्ट; इस ऑपरेटर के अंदर कोई जादू नहीं है, यह सिर्फ टाइप किया गया है ... प्रारूप -> ... प्रारूप -> ... प्रारूप', और टाइप अनुमान यह जांचने का काम करता है कि इसके पैरामीटर इस प्रकार के हैं, निरंतर तार। – gasche
गैसचे सही है। क्या समझने की आवश्यकता है कि जब आप 'प्रिंट' * printf' को स्ट्रिंग देते हैं तो आप इसे 'Pervasives.string' प्रकार का मान नहीं देते हैं, तो आप इसे' Pervasives.format6' '(जो नहीं है) का मान देते हैं 'Pervasives.string' के बराबर)। –
ठीक है, मुझे अभी यह कहना चाहिए था कि (^^) में प्रकार गैसचे देता है। उस हिस्से में निश्चित रूप से कोई जादू नहीं है। एकमात्र जादू (जैसा कि मैं इसे समझता हूं) उपयुक्त 'प्रारूप' प्रकार के लिए स्ट्रिंग स्थिरांक के प्रचार में है। –