2008-10-08 21 views
23

की छिपी हुई विशेषताएं यह एक समान C# प्रश्न का अनचाहे प्रयास है।एफ #

तो क्या कर रहे हैं अपने पसंदीदा एफ # छिपा (या नहीं) सुविधाओं?

सुविधाओं मैं अब तक का उपयोग किया है वास्तव में छिपा हुआ नहीं है लेकिन काफी ताज़ा किया गया है में से अधिकांश। सी # या वीबी.नेट की तुलना में ऑपरेटरों को अधिभारित करना कितना छोटा है।

और Async<T> मुझे कुछ असली बदसूरत कोड बंद दाढ़ी में मदद मिली है।

मैं काफी अभी भी भाषा के लिए नया हूँ तो यह जानने के लिए कि क्या अन्य सुविधाओं जंगली में इस्तेमाल किया जा रहा महान होगा।

उत्तर

1

कोई छिपी हुई विशेषताएं नहीं हैं, क्योंकि F # डिज़ाइन मोड में है। हमारे पास जो कुछ है वह एक तकनीकी पूर्वावलोकन है, जो हर दो महीने में बदल जाता है।

देख http://research.microsoft.com/fsharp/

+2

मुझे लगता है कि इसलिए हर सुविधा किसी भी तरह छिपी हुई है;) – wishi

6

हाँ, एफ # किसी भी 'छुपा' सुविधाएँ नहीं हैं, लेकिन यह सुनिश्चित सरल भाषा में पैक शक्ति का एक बहुत है। भाषा की एक कम ज्ञात विशेषता है, जहां तथ्य मूल रूप से टाइप किया गया है, इसके बावजूद आप enable duck typing मूल रूप से कर सकते हैं।

7

स्वचालित रूप से बना बीजीय डेटा प्रकार (lexicographical आदेश के आधार पर) एक अच्छा फीचर अपेक्षाकृत अनजान है के लिए तुलना कार्य; एक उदाहरण के लिए देखें

http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!548.entry

3

उपयोगिता स्क्रिप्टिंग भाषा के रूप में F # का उपयोग सराहना की जा सकती है। एफ # उत्साही quants होने लगता है। कभी-कभी आप अपने एमपी 3 (या डेटाबेस सर्वर के दर्जनों) का बैक अप लेना चाहते हैं जो बैच की तुलना में थोड़ा अधिक मजबूत है। मैं jscript/vbscript के लिए एक आधुनिक प्रतिस्थापन के लिए शिकार कर रहा हूं। हाल ही में, मैंने आयरनपीथन का उपयोग किया है, लेकिन एफ # अधिक पूर्ण हो सकता है और .NET इंटरैक्शन कम बोझिल है।

मैं मनोरंजन मूल्य के लिए curried functions पसंद है। कम से कम तीन डब्ल्यूटीएफ के लिए शुद्ध प्रक्रियात्मक/ओओपी कार्यक्रम में एक करीबी कार्य दिखाएं। इस के साथ शुरू, एक बुरी तरह से एफ # धर्मान्तरित प्राप्त करने के लिए है, हालांकि :)

+0

मुझे छोटी स्क्रिप्ट के लिए एफएसआई का उपयोग करना पसंद है, और मैंने वास्तव में चीजों के लिए कुछ .fsx फ़ाइलों का उपयोग किया है। हालांकि, कम से कम मेरे अनुभव में, .fsx फ़ाइलों के लिए आवश्यक स्टार्टअप समय सामान्य उद्देश्य स्क्रिप्टिंग के लिए बहुत अधिक है। मैं अभी भी स्क्रिप्टिंग के लिए बैच फ़ाइलें और पर्ल स्क्रिप्ट पसंद करते हैं। – Juliet

+0

पावरशेल आज़माएं और आपको खेद नहीं होगा :) – stej

6

इस सवाल

F# operator "?"

प्रश्न चिह्न ऑपरेटर पर जानकारी के लिए और देखें कि यह कैसे एक निर्माण करने के लिए बुनियादी भाषा तंत्र प्रदान करता है सी # में 'गतिशील' के समान सुविधा।

10

एफ # "हस्ताक्षर फ़ाइलें" कहा जाता है एक छोटे से इस्तेमाल किया सुविधा है। आप सार्वजनिक प्रकार/तरीकों/मॉड्यूल/कार्य से भरा एक बड़ा कार्यान्वयन फ़ाइल हो सकता है, लेकिन फिर आप छिपाने और चुनिंदा कि कार्यक्षमता का खुलासा एक हस्ताक्षर फ़ाइल के माध्यम से कार्यक्रम की अगली कड़ी के लिए कर सकते हैं। यही कारण है कि एक हस्ताक्षर फ़ाइल स्क्रीन का एक प्रकार/फिल्टर है कि आप संस्थाओं लेकिन "कार्यक्रम के आराम करने के लिए निजी" "इस फ़ाइल की सार्वजनिक" बनाने के लिए सक्षम बनाता है के रूप में कार्य करता है। क्योंकि आप कैप्सूलीकरण इस तरह के लिए है ही अन्य/पूर्व उपकरण विधानसभाओं है

मैं इस तरह लग रहा है, नेट मंच पर एक सुंदर हत्यारा सुविधा है। आप कुछ ही संबंधित प्रकार है कि एक दूसरे के आंतरिक विवरण देखने के लिए सक्षम होना चाहते हैं के साथ एक छोटे घटक है, लेकिन उन प्रकार के उन सभी बिट्स हर किसी सार्वजनिक नहीं करना चाहते, तो आप क्या कर सकते हैं?ठीक है, तुम दोनों कर सकते हैं:

  1. आप एक अलग विधानसभा में कि घटक डाल सकते हैं, और सदस्यों को बताया कि उन प्रकार के शेयर "आंतरिक" हो बनाने के लिए, और संकीर्ण हिस्सा आप हर किसी की हो देखने के लिए "चाहते हैं सार्वजनिक ", या
  2. आप आंतरिक सामग्री को" आंतरिक "चिह्नित करते हैं लेकिन आप उन प्रकारों को अपनी विशाल असेंबली में छोड़ देते हैं और उम्मीद करते हैं कि असेंबली में मौजूद सभी अन्य कोड उन सदस्यों को कॉल न करने का विकल्प चुनते हैं जिन्हें केवल 'आंतरिक' चिह्नित किया गया था क्योंकि इसे देखने के लिए एक अन्य प्रकार की आवश्यकता है।

मेरे अनुभव में, बड़ी सॉफ्टवेयर परियोजनाओं पर, हर कोई हमेशा # 2 करता है, क्योंकि # 1 विभिन्न कारणों से गैर स्टार्टर है (लोग 50 छोटी असेंबली नहीं चाहते हैं, वे 1 या 2 या 3 बड़े चाहते हैं असेंबली, अन्य संभव कारणों के लिए जो encapsulation बिंदु से संबंधित नहीं है, मैं उठा रहा हूं (एक तरफ: हर कोई ILMerge का उल्लेख करता है लेकिन कोई भी इसका उपयोग नहीं करता))।

तो आपने विकल्प # 2 चुना है। फिर एक साल बाद, आप अंततः उस घटक को दोबारा करने का फैसला करते हैं, और आप पाते हैं कि पिछले वर्ष में, 17 अन्य स्थानों ने अब उस 'आंतरिक' विधि में बुलाया था जो वास्तव में केवल एक अन्य प्रकार के कॉल के लिए था, इसे वास्तव में बनाना उस बिट को कारक करना मुश्किल है क्योंकि अब हर कोई उन कार्यान्वयन विवरणों पर निर्भर करता है। ओह।

बिंदु यह है कि, नेट में मध्यम आकार के अंतर-असेंबली encapsulation स्कोप/सीमा बनाने के लिए कोई अच्छा तरीका नहीं है। अक्सर "आंतरिक" बहुत बड़ा होता है और "निजी" बहुत छोटा होता है।

... एफ # तक। एफ # हस्ताक्षर फ़ाइलों के साथ, आप कार्यान्वयन फ़ाइल के भीतर सार्वजनिक रूप से सामान के समूह को चिह्नित करके "इस स्रोत कोड फ़ाइल" का एक encapsulation दायरा बना सकते हैं, इसलिए फ़ाइल में मौजूद सभी अन्य कोड इसे देख सकते हैं और उस पर पार्टी कर सकते हैं, लेकिन फिर उपयोग करें सभी विवरणों को छिपाने के लिए एक हस्ताक्षर फ़ाइल संकीर्ण सार्वजनिक इंटरफ़ेस की अपेक्षा करती है जो घटक दुनिया के बाकी हिस्सों में प्रकट होता है। यह खुश है एक फ़ाइल में तीन अत्यधिक संबंधित प्रकारों को परिभाषित करें, उन्हें एक-दूसरे के कार्यान्वयन के विवरण देखने दें, लेकिन केवल सभी को वास्तव में सार्वजनिक सामग्री का पर्दाफाश करें। जीत!

हस्ताक्षर फ़ाइलें शायद इंट्रा-विधानसभा कैप्सूलीकरण सीमाओं के लिए आदर्श सुविधा नहीं हैं, लेकिन वे केवल ऐसी सुविधा मुझे पता कर रहे हैं, और इसलिए मैं सागर में एक जीवन बेड़ा की तरह उन्हें चिपटना।

टीएल; डीआर

जटिलता दुश्मन है। Encapsulation सीमाएं इस दुश्मन के खिलाफ एक हथियार हैं। "निजी" एक महान हथियार है लेकिन कभी-कभी लागू होने के लिए बहुत छोटा होता है, और "आंतरिक" अक्सर बहुत कमजोर होता है क्योंकि इतना कोड (संपूर्ण असेंबली और सभी आंतरिक दृश्यमान) आंतरिक सामान देख सकते हैं। एफ # "एक प्रकार के लिए निजी" से बड़ा गुंजाइश प्रदान करता है लेकिन "पूरी असेंबली" से छोटा है, और यह बहुत उपयोगी है।

2

inlined सामान्य प्रकार पर ऑपरेटरों विभिन्न सामान्य की कमी हो सकती है:

type 'a Wrapper = Wrapper of 'a with 
    static member inline (+)(Wrapper(a),Wrapper(b)) = Wrapper(a + b) 
    static member inline Exp(Wrapper(a)) = Wrapper(exp a) 

let objWrapper = Wrapper(obj()) 
let intWrapper = (Wrapper 1) + (Wrapper 2) 
let fltWrapper = exp (Wrapper 1.0) 

(* won''t compile *) 
let _ = exp (Wrapper 1) 
+0

बस स्पष्ट करने के लिए, क्या होगा यदि (+) और एक्सपलाइन इनलाइन के रूप में घोषित नहीं किया गया था? – Joh

+0

@ जोह: ऑपरेटर अब पॉलिमॉर्फिक नहीं होंगे, इसलिए उदाहरण के लिए आप केवल अपने प्रोग्राम के भीतर एक प्रकार के रैपर पर (+) ऑपरेटर का उपयोग कर सकते हैं। ऊपर दिए गए सभी कोड अभी भी काम करेंगे, लेकिन इनलाइन ऑपरेटरों के साथ, हम दो 'फ्लोट रैपर' भी जोड़ सकते हैं। – kvb

29

उपयोगकर्ता परिभाषित सांख्यिक शाब्दिक (FromZero, FromOne, आदि एक मॉड्यूल जिसका नाम NumericLiteral साथ शुरू होता है और जो कुछ तरीकों को परिभाषित करता है प्रदान करके परिभाषित किया जा सकता)।

विशेष रूप से, आप LanguagePrimitives.GenericZero और LanguagePrimitives.GenericOne फोन करने के लिए इस का उपयोग एक और अधिक पठनीय वाक्यविन्यास प्रदान करने के लिए कर सकते हैं:

module NumericLiteralG = begin 
    let inline FromZero() = LanguagePrimitives.GenericZero 
    let inline FromOne() = LanguagePrimitives.GenericOne 
end 

let inline genericFactorial n = 
    let rec fact n = if (n = 0G) then 1G else n * (fact (n - 1G)) 
    fact n 

let flt = genericFactorial 30. 
let bigI = genericFactorial 30I 
+2

बहुत बढ़िया विचार - डिफ़ॉल्ट रूप से सक्षम होना चाहिए। – forki23

+0

यह एक बहुत अच्छी चाल है, लेकिन ऐसा लगता है कि केवल जी, एन, क्यू, आर और जेड – Gustavo

8

संकलक को --warnon:1182 पासिंग अप्रयुक्त चर के बारे में चेतावनी चालू हो जाती है; अंडरस्कोर से शुरू होने वाले वेरिएबल नाम प्रतिरक्षा हैं।

+0

के साथ काम करता है धन्यवाद! यह कंपाइलर विकल्प पृष्ठ पर नहीं था! सचमुच छुपा –

+1

एफ # 2.0, संकलक मुद्दों इस चेतावनी के रूप में, दिलचस्प: एफएससी: चेतावनी FS0075: कमांड लाइन विकल्प '--warnon' आंतरिक उपयोग के लिए केवल –

5

वास्तव में छिपा नहीं, लेकिन एक गैर एमएल व्यक्ति के रूप में यह मेरे लिए काफी कुछ समय के लिए भाग निकले:

पैटर्न मिलान डाटा संरचनाओं में मनमाने ढंग से गहरी विघटित कर सकते हैं।

यहां एक [अविश्वसनीय मनमानी] नेस्टेड ट्यूपल उदाहरण है; इस सूची या यूनियनों या नेस्टेड मानों के किसी भी संयोजन पर काम करता है:

let listEven = 
    "Manipulating strings can be intriguing using F#".Split ' ' 
    |> List.ofArray 
    |> List.map (fun x -> (x.Length % 2 = 0, x.Contains "i"), x) 
    |> List.choose 
    (function (true, true), s -> Some s 
       | _, "F#"   -> Some "language" 
       | _    -> None) 
9

मुझे आश्चर्य है कि अगर आप अपने devenv.exe.config फाइल करने के लिए

<appSettings> 
    <add key="fsharp-navigationbar-enabled" value="true" /> 
</appSettings> 

जोड़ने क्या होता है? (अपने जोखिम पर प्रयोग करें।)

+5

किसी भी मौका आप हमें सूचित करेंगे बिना हमें वास्तव में यह कोशिश कर रहा है? –

+0

तो ऐसा कोई कारण मैं इस पर छोड़ नहीं करना चाहिए है? यह अच्छा है। क्या आप जानते हैं अगर यह vNext में हो जाएगा? – Daniel

+0

यह अच्छी तरह से परीक्षण नहीं किया गया है, संभवतः वी.एस. अधिक दुर्घटनाग्रस्त होने का खतरा हो सकता है। अभी तक पता नहीं है अगर यह vNext में हो जाएगा ... वहाँ भी हो सकता है "समाधान नेविगेटर" है, और होगा देखें कि हम अनुसूची में फिट कर सकते हैं ... – Brian