2017-04-13 6 views
7

एफ # के printf में प्रारूप विनिर्देशक %A है जो किसी भी F # प्रकार में पास करने में सक्षम बनाता है, और इसका मूल्यांकन और मुद्रित किया जाएगा।एफ # के प्रिंटफ में% ए विनिर्देशक ओकैमल के प्रिंटफ़ में मौजूद नहीं है?

एक उदाहरण के रूप:

type Result<'a> = 
    | Failure 
    | Success of 'a  

printf "%A" (Success "hello") // prints out 'Success "hello"' 

कहाँ, स्पष्ट रूप से, Result<'a> नहीं है निर्मित एक प्रकार।

मैं OCaml में एक समान प्रकार घोषणा कर सकते हैं, लेकिन वहाँ Printf.printf के लिए कोई समकक्ष विनिर्देशक है - इसके बजाय, मैं अपने खुद के string_of_result समारोह को लागू करने के लिए होता है, और प्रारूप स्ट्रिंग में %s विनिर्देशक का उपयोग करें। इसके अलावा, चूंकि यह एक पॉलीमोर्फिक प्रकार है, इसलिए मुझे एक सीधा-सरल फ़ंक्शन बनाना होगा जो 'a के किसी भी प्रकार के उदाहरण को संभाल सकता है।

मेरा सवाल है - ओकैमल में इस आसान विनिर्देशक की कमी क्यों है? क्या ऐसा इसलिए है क्योंकि इसे लागू करने के लिए कोई प्रोत्साहन नहीं है? क्या ऐसा इसलिए है क्योंकि अंडर-द-हूड मोोजो की कमी है, जो कि एफ # में है?

उत्तर

7

मैं कहूंगा कि "अंडर-द-हूड मोोजो की कमी" शायद कारण है।

एफ #, %A विनिर्देशक प्रतिबिंब-आधारित प्रिंटर पर प्रिंटिंग को रोकता है - यह रनटाइम प्रकार की जानकारी का उपयोग करता है ताकि मूल्य को पार करने और मुद्रित किया जा सके। उस प्रक्रिया में उपयोग की गई प्रतिबिंब एपीआई एक .NET- विशिष्ट चीज़ है। आसान होने पर, यह तुलनात्मक रूप से महंगी तंत्र भी है - यदि आप अधिक ठोस उपयोग कर सकते हैं तो इसे कंबल विनिर्देशक के रूप में उपयोग नहीं किया जाना चाहिए।

मुझे जो पता है, उससे ओकैमल में समान प्रतिबिंब क्षमता नहीं है जिसका उपयोग यहां किया जा सकता है। शायद एक और तंत्र है जो आपको एक सामान्य प्रिंट लागू करने देगा - लेकिन मैं ओकैमल इंटर्नल के साथ पर्याप्त परिचित नहीं हूं।

6

ओकैम में ऐसा करने का सामान्य तरीका %a विनिर्देशक का उपयोग करना है, और इसे पास करने के लिए result के लिए प्रिंटर लिखें (या प्राप्त करें)।

कि इस प्रकार दिखाई देंगे:

type 'a result = 
    | Success of 'a 
    | Failure 
[@@deriving show] 

Format.printf "%a" (pp_result Format.pp_print_string) (Success "hello") 

जहां pp_resultderiving खंड द्वारा उत्पन्न किया गया है। ध्यान दें कि pp_result एक स्वरूपण फ़ंक्शन को एक तर्क के रूप में लेता है जो इसे 'a एस प्रिंट करने के लिए उपयोग करता है।

ओकैमल संकलन के दौरान पूरी तरह से प्रकार (लगभग) मिटा देता है, इसलिए प्रतिबिंब का उपयोग एफ # में एक ऑटोमैजिकल प्रिंटिंग फ़ंक्शन को लागू करने के लिए नहीं किया जा सकता है। यह स्पष्ट नहीं है कि प्रतिबिंब एक प्रकार की भाषा में अच्छी तरह से काम करेगा, वैसे भी।

+0

बस एक अतिरिक्त के रूप में: इस समाधान को पीपीएक्स द्वारा प्रोसेसिंग की आवश्यकता है - जब मैं सिर्फ आरपीएल को कोड कॉपी और पेस्ट करता हूं, तो '' pp_result''' अभी भी अपरिभाषित है। –

+0

@ lambda.xy.x - मैंने इसे भी देखा। किसी कारण से मेरे पास पहले से 'opx' के माध्यम से' ppx_deriving' स्थापित किया गया था, लेकिन अब एक त्रुटि फेंक दी गई है: 'डेरिवर्स शो का पता नहीं लगाया जा सकता है'। – asafc

+1

हाँ, मैं वास्तव में 'printf' विनिर्देशकों के बारे में एक प्रतिक्रिया जटिल नहीं करना चाहता था जो 'ppx_deriving' को कॉन्फ़िगर/कॉन्फ़िगर करने के विवरण के साथ है। (संदर्भ के लिए: अपूर्ण में, '#use "topfind" 'और फिर' #ququire" ppx_deriving.show "'। लेकिन विवरण के लिए 'ppx_deriving' दस्तावेज़ देखें।) – gsg

संबंधित मुद्दे