2010-10-28 17 views
6

क्या आंशिक रूप से bprintf जैसे फ़ंक्शन को लागू करना संभव है और इसे प्रारंभिक उपयोग के आधार पर प्रतिबंधित होने से रोकें?आंशिक रूप से लागू फ़ंक्शन जेनेरिक

मैं निम्न कार्य करना चाहते हैं:

let builder = new System.Text.StringBuilder() 
let append = Printf.bprintf builder 
append "%i" 10 
append "%s" string_value 

उत्तर

8

आप स्पष्ट प्रारूप तर्क

let builder = new System.Text.StringBuilder() 
let append format = Printf.bprintf builder format 
append "%i" 10 
append "%s" "1" 
+0

धन्यवाद। क्या कोई यह समझा सकता है कि यह क्यों काम करता है और आंशिक आवेदन नहीं करता है? – Daniel

+10

क्योंकि .NET में, फ़ंक्शन सामान्य हो सकते हैं और चर नहीं कर सकते हैं। 'फ़ंक्शन का वर्णन करें =' फ़ंक्शन का वर्णन करता है; 'एपेंड =' एक चर का वर्णन करते हैं। –

12

इस मूल्य प्रतिबंध कहा जाता है के कारण है कि एफ # के पहलू जोड़ सकते हैं। आप देख सकते हैं कि यदि आप एफ # इंटरएक्टिव करने के लिए सिर्फ दो let घोषणाओं में प्रवेश (ताकि संकलक पहला प्रयोग से प्रकार का अनुमान लगा नहीं करता है):

> let builder = new System.Text.StringBuilder() 
    let append = Printf.bprintf builder ;; 

त्रुटि FS0030: मान प्रतिबंध। मूल्य 'एपेंड' का अनुमान जेनेरिक प्रकार वैल एपेंड: ('_a ->' _b) होने पर अनुमानित किया गया है: '_a:> Printf.BuilderFormat <' _b> या तो तर्क 'स्पष्ट' करने के लिए तर्क दें या यदि आप के लिए सामान्य होने का इरादा नहीं है, एक प्रकार की एनोटेशन जोड़ें।

एफ # टीम से excellent article by Dmitry Lomov है जो इसे विस्तार से बताता है। जैसा कि लेख से पता चलता है, एक समाधान स्पष्ट प्रकार पैरामीटर घोषणा जोड़ने के लिए है:

let builder = new System.Text.StringBuilder() 
let append<'T> : Printf.BuilderFormat<'T> -> 'T = Printf.bprintf builder 
append "%i" 10 
append "%s" "Hello" 

यह ठीक काम करेगा।

6

आप F # मान प्रतिबंध का सामना कर रहे हैं। यहाँ Understanding F# Value Restriction Errors

एक काफी गहराई लेख इसके पीछे कारण बताते हुए बताया गया है::

यहाँ कुछ समाधान का एक अच्छा व्याख्या दी गई है http://blogs.msdn.com/b/mulambda/archive/2010/05/01/value-restriction-in-f.aspx

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