2011-08-25 14 views
7

मान लें कि मेरे पास एक ऐसा कार्य है जो कुछ जटिल करता है और इसे उपखंडों की सहायता से लागू किया जाता है। चीजों को आसान बनाने के लिए, tuples के बजाय मैं कुछ इंटरमीडिएट संरचनाओं का उपयोग करना चाहता हूं जो इस फ़ंक्शन के कार्यान्वयन के लिए निजी हैं।क्या एफ # में फ़ंक्शन स्कोप पर एक प्रकार घोषित करना संभव है?

मैं नहीं चाहता कि इन संरचनाओं की घोषणा बाहर निकलने के लिए। तो मुझे ऐसा कुछ चाहिए:

let someComplexFun p = 
    type SomeRecord  = {i:int; x:int; y:int;} 
    type SomeOtherRecord = {...} 

    let innerFunctionA (x:SomeRecord) = ... 
    let innerFunctionB (x:SomeOtherRecord) = ... 

    ... 

मैंने कोशिश की लेकिन निश्चित रूप से संकलक मुझे ऐसा करने नहीं देता है। मैंने प्रलेखन को देखा और मैं कहीं भी जल्दी नहीं देख सकता कि प्रकार मॉड्यूल स्तर पर घोषित किए जाने चाहिए।

उदाहरण के लिए लिस्प में, ऐसा लगता है कि यह सब पूरी तरह से कानूनी, उदा .:

(defun foo (when) 
    (declare (type (member :now :later) when)) ; Type declaration is illustrative and in this case optional. 
    (ecase when 
     (:now (something)) 
     (:later (something-else)))) 

तो, मुझे याद आ रही कुछ है? क्या यह संभव है अगर एफ # बिल्कुल?

+0

शायद कार्य प्रथम श्रेणी के हैं लेकिन कक्षाएं नहीं हैं;) ... नहीं, यह वास्तव में अजीब है - ऐसी चीज को बेनामी वर्ग में क्यों संकलित नहीं करें? लेकिन समाधान आसान है क्योंकि कॉमरेड पी ने लिखा था। मुझे लगता है कि यदि आपका कार्य इतना लंबा है कि आपको आंतरिक प्रकार देने की ज़रूरत है तो शायद आपको – Carsten

उत्तर

5

के लिए एक लिंक सत्यापित करने के लिए कि यह अनुमति नहीं है विनिर्देश के अनुसार, विनिर्देश में एफ # भाव के व्याकरण पर एक नज़र डालें: Section 6: Expressions। इसमें विभिन्न संरचनाएं सूचीबद्ध हैं जिनका उपयोग expr के स्थान पर किया जा सकता है और उनमें से कोई भी एक प्रकार की घोषणा type-defn (Section 8: Type Declarations में वर्णित) है।

फ़ंक्शन घोषणाओं के लिए (सरलीकृत) वाक्यविन्यास let ident args = expr है, इसलिए शरीर को अभिव्यक्ति होना चाहिए (और आप अभिव्यक्तियों के अंदर प्रकार घोषित नहीं कर सकते हैं)।

1

प्रकार केवल F # में मॉड्यूल या नेमस्पेस स्कोप पर घोषित किए जा सकते हैं।

(आप internal या हस्ताक्षर फ़ाइलों की तरह पहुँच संशोधक का उपयोग अन्य घटकों से प्रकार को छिपाने के लिए कर सकते हैं।)

+0

पर कुछ रिफैक्टरिंग के बारे में सोचना चाहिए, जहां दस्तावेज़ में वास्तव में ऐसा कहा जाता है? मुझे यह नहीं मिला। कृपया लिंक दे? –

+2

यदि आप "सबूत" चाहते हैं, तो आप भाषा विनिर्देशों को देख सकते हैं। साथ ही, यदि आप केवल इन कार्यों के लिए मॉड्यूल बनाते हैं, तो यह प्रकारों को निजी के रूप में चिह्नित करना बेहतर होगा, न कि आंतरिक के रूप में। निजी साधन केवल उस विशिष्ट मॉड्यूल में, केवल उस विशिष्ट "प्रोजेक्ट" (या असेंबली) में आंतरिक साधन हैं। –

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