2009-05-10 15 views
13

मेरे पास FileInfo का अनुक्रम है, लेकिन मुझे केवल उनके स्ट्रिंग नामों की परवाह है, इसलिए मुझे स्ट्रिंग का अनुक्रम चाहिए। पहले तो मुझे कुछ इस तरह की कोशिश की:एफ # का प्रकार अनुमान क्यों संभाल नहीं सकता है?

Seq.map (fun fi -> fi.Name) fis 

लेकिन किसी कारण से, एफ # के प्रकार निष्कर्ष काफी अच्छा यह अनुमति देने के लिए नहीं है, और बनाया मुझे स्पष्ट रूप से एक प्रकार को "इंटरनेट" दे:

Seq.map (fun (fi : FileInfo) -> fi.Name) fis 

इस एनोटेशन की आवश्यकता क्यों है? यदि यह ज्ञात है कि fis : seq<FileInfo> और Seq.map : ('a -> 'b) -> seq<'a> -> seq<'b>, तो यह अनुमान नहीं लगाया जाना चाहिए कि लैम्ब्डा अभिव्यक्ति का प्रकार FileInfo -> 'b है, और फिर fi.Name : string से, और अनुमान लगाएं कि इसका प्रकार FileInfo -> string है?

उत्तर

24

टाइप अनुमान बाएं से दाएं काम करता है। यह वह जगह है जहां पाइपलाइन ऑपरेटर उपयोगी है; यदि आप पहले से ही 'fis' के प्रकार को जानते हैं, तो इसे

fis |> Seq.map (fun fi -> fi.Name) 

और अनुमान आपके लिए काम करता है।

(सामान्य तौर पर, प्रपत्र

o.Property 
o.Method args 

की अभिव्यक्ति 'ओ' में जाना जाने के प्रकार की आवश्यकता होती है एक प्रायोरी; अधिकांश अन्य भाव, जब एक प्रकार नीचे पिन नहीं की है निष्कर्ष प्रणाली कर सकते हैं के लिए 'एक बाधा तैरती है' जिसे बाद में हल किया जा सकता है, लेकिन इन मामलों के लिए, 'पी नामक संपत्ति वाले सभी प्रकार' या 'एम नामक विधि के साथ सभी प्रकार' (जैसे बतख टाइपिंग) के रूप में कोई बाधा नहीं है जो कि कर सकते हैं स्थगित और बाद में हल किया जाना चाहिए। तो आपको अब उस जानकारी की आवश्यकता है, या अनुमान तुरंत विफल हो जाता है।)

यह भी देखें overview of type inference in F#

+4

मुझे आशा है कि वे टाइप अनुमान को और अधिक मजबूत बना देंगे। मैंने पहले ही कुछ मामलों को मारा है जहां मुझे कक्षा में विधियों को पुन: व्यवस्थित करना था या मुझे बहुत सामान्य प्रकार की त्रुटियां मिलेंगी। – gradbot

+1

इसके लायक होने के लिए, इस ब्लॉग पोस्ट और इसकी कुछ टिप्पणियों में एफ 2 की कुछ शक्तियों और कमजोरियों के प्रकार के उपयोगी प्रकार में उपयोगी स्पष्टीकरण है: http://neilmitchell.blogspot.com/2008/12/f-from-haskell- perspective.html – Juliet

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