- F# 9 क्यों महत्वपूर्ण है: F# 9 कई व्यापक सुधार लाता है, जो प्रोग्राम को अधिक सुरक्षित, अधिक resilient और बेहतर performance वाला बनाते हैं
Nullable reference types
- F# को
null से बचने के लिए डिज़ाइन किया गया था, लेकिन C# में लिखी गई .NET libraries के साथ interface करते समय null मिल सकता है
- अब F# ऐसे reference types को type-safe तरीके से संभाल सकता है जिनमें
null एक वैध मान हो
- उदाहरण:
let notAValue: string | null = null
let len (str: string | null) = match str with | null -> -1 | NonNull s -> s.Length
Discriminated Union की .Is* properties
- Discriminated Union में अब हर case के लिए automatically generated properties होती हैं
- इससे यह जाँचा जा सकता है कि कोई value किसी विशेष case की है या नहीं
- उदाहरण के लिए
person.contact.IsEmail की तरह लिखा जा सकता है
Partial active patterns अब unit option की जगह bool लौटा सकते हैं
- पहले partial active patterns match होने पर
Some () और नहीं होने पर None लौटाते थे
- अब वे
bool भी लौटा सकते हैं
Argument दिए जाने पर built-in properties की तुलना में extension methods को प्राथमिकता
- अब F# उन extension methods को resolve करता है जिनका नाम type की built-in property जैसा ही हो
- यह कुछ .NET libraries में दिखने वाले pattern के अनुरूप है
Empty body वाले Computation Expression का support
- अब F# empty Computation Expression को support करता है
- उदाहरण:
let xs = seq { }
- इससे builder की
Zero method call होती है
Hash directives अब string के अलावा अन्य arguments भी स्वीकार करते हैं
- Compiler के लिए hash directives पहले केवल quotes में दिए गए string arguments ही स्वीकार करते थे
- अब वे किसी भी type के arguments ले सकते हैं
- उदाहरण:
#nowarn 0070
fsi में #help directive का विस्तार
- F# Interactive का
#help directive अब दिए गए object या function के लिए documentation दिखाता है
- इसे quotes के बिना pass किया जा सकता है
- उदाहरण:
#help List.map;;
Warning disable करने के लिए #nowarn में FS prefix का support
- पहले
#nowarn "FS0057" लिखने पर invalid warning number का message मिलता था
- अब prefix होने पर भी warning number स्वीकार किया जाता है
Non-recursive functions या let से bind की गई values पर TailCall attribute इस्तेमाल करने पर warning
- अब F# warning देता है अगर
[<TailCall>] attribute गलत जगह इस्तेमाल किया गया हो
- इसका code पर असर नहीं पड़ता, लेकिन यह पढ़ने वाले को भ्रमित कर सकता है
Attribute target application
- Compiler अब
let values, functions, union case declarations, implicit constructors, structs और classes पर AttributeTargets को सही तरह लागू करता है
- इससे ऐसे bugs रोके जा सकते हैं जैसे Xunit tests में
unit argument जोड़ना भूल जाना
Standard library updates
Collections के लिए Random functions
List, Array, Seq modules में random sampling और shuffle के लिए नए functions जोड़े गए हैं
- implicit, thread-safe shared
Random instance इस्तेमाल करने वाले versions
Random instance को argument के रूप में लेने वाले versions
- custom randomizer function लेने वाले versions
Shuffle, Choice, Choices, Sample functions उपलब्ध हैं
CustomOperationAttribute का parameterless constructor
- इससे Computation Expression builders के लिए custom operations बनाना आसान हो जाता है
- अब नाम को explicitly देने की ज़रूरत नहीं होती (ज़्यादातर मामलों में नाम method name से मेल खाता है)
F# List और Set के लिए C# collection expressions का support
- C# से F#
List और Set इस्तेमाल करते समय उन्हें collection expressions से initialize किया जा सकता है
- उदाहरण:
FSharpSet<int> mySet = [ 1, 2, 3 ];
Developer productivity improvements
Parser recovery
- Parser recovery में लगातार सुधार किए गए हैं
- इससे code edit करते समय, भले ही वह हर समय syntactically सही न हो, tools काम करते रहते हैं
Diagnostics
- F# 9 में कई नए या बेहतर diagnostic messages हैं
- जैसे ambiguous override methods, abstract members के उपयोग, duplicate fields वाले unions आदि
Real visibility
- F# में assemblies generate करने के तरीके में एक समस्या है, जहाँ private members IL में internal के रूप में लिखे जाते हैं
- अब
--realsig+ compiler flag से इस behavior को ठीक किया जा सकता है
Performance improvements
Optimized equality checks
- Equality checks अब तेज़ हैं और memory allocation कम करती हैं
Struct Discriminated Union में field sharing
- अगर struct DU के कई cases में एक ही नाम और type के fields हों, तो वे एक ही memory location साझा कर सकते हैं
- इससे struct की memory footprint कम होती है
Integer range optimization
- Compiler अब
start..finish और start..step..finish expressions के और अधिक instances के लिए optimized code generate करता है
- पहले optimization केवल तब होती थी जब type
int/int32 हो और step constant 1 या -1 हो
- अब सभी integer types और अन्य step values भी optimize होते हैं
List/Array comprehension में for x in xs -> ... optimization
List और Array comprehensions में for x in xs -> ... को optimize किया गया है
- खासकर
Array में 10x तक speedup और allocation size में लगभग 1/3 से 1/4 तक कमी
Tooling improvements
Visual Studio में Live Buffer
- पहले यह opt-in feature था, लेकिन अब default रूप से enabled है
- IDE का background compiler अब live file buffer के साथ काम करता है
- Changes लागू करने के लिए file को disk पर save करना ज़रूरी नहीं है
Unnecessary parentheses हटाने के लिए analyzer और code fix
- कभी-कभी clarity के लिए extra parentheses इस्तेमाल होते हैं, लेकिन कई बार वे सिर्फ़ noise होते हैं
- अब Visual Studio parentheses हटाने के लिए code fix देता है
Visual Studio में F# के लिए custom visualizer support
- Visual Studio के debugger visualizers अब F# projects में भी काम करते हैं
Pipeline के बीच में signature tooltip दिखाना
- पहले ऐसी स्थिति में signature help नहीं मिलती थी, जहाँ pipeline के बीच मौजूद function पर complex curried parameters (जैसे lambda) पहले से लागू हों
- अब अगले parameter के लिए signature tooltip दिखाई जाती है
1 टिप्पणियां
Hacker News टिप्पणियाँ
F# कॉलेज के दिनों में पहली बार जानने के बाद से मेरी पसंदीदा भाषा रही है। इसमें C# से आगे की कई सुविधाएँ हैं, और C# भी इन्हें अपना रहा है, लेकिन compatibility समस्याओं के कारण कठिनाई होती है। F# अब भी एक शानदार भाषा है, .NET ecosystem के साथ compatible है, और कम boilerplate के साथ C# के बराबर performance दे सकती है
F# Microsoft के Excel के बाद जारी किए गए सबसे बेहतरीन उत्पादों में से एक है, और इसने .NET को एक व्यावहारिक platform में बदल दिया
मैंने F# आधारित Phosphor project में बड़ा निवेश किया था, लेकिन अंततः उसे Typescript और Rust में पूरी तरह rewrite करना पड़ा। Fable library के जरिए अलग-अलग technologies के बीच type safety बनाए रखने की कोशिश की, लेकिन libraries के बीच interoperability और dependency management कठिन था। मेरा मानना है कि F# तभी उपयुक्त है जब पारंपरिक frontend/backend विभाजन हो
एक cryptography class में, जहाँ .NET इस्तेमाल करने वाली भाषाओं में से चुन सकते थे, F# में लिखा मेरा assignment दूसरों की तुलना में पढ़ने में आसान था। डेटा साइंस का लगभग 100% काम Python में होने के कारण F# का अधिक उपयोग नहीं कर पाता
F# में काम करना याद आता है, लेकिन मैं इसके updates पर लगातार नज़र रखता हूँ। community के छोटे आकार और Microsoft की उदासीनता के बावजूद tools काफ़ी अच्छे थे। सबसे बड़ी समस्या code test coverage की सटीकता थी
मैंने हाल ही में F# आज़माया, और Python से आने वाले व्यक्ति के रूप में REPL इस्तेमाल कर पाना मुझे पसंद आया। सर्दियों में एक छोटा web backend project बनाकर भाषा और ecosystem को बेहतर समझना चाहता हूँ। http हिस्से के लिए Oxpecker के बारे में अच्छी बातें सुनी हैं
मैं F# की versioning पद्धति को लेकर उत्सुक हूँ। quality improvements तो बहुत हैं, लेकिन major version change की ज़रूरत नहीं लगती। सोच रहा हूँ कि क्या इसका कारण .NET9 के साथ version number मिलाना है
जानना चाहता हूँ कि Windows पर GUI apps बनाने के लिए C# के विकल्प के रूप में F# की स्थिति कैसी है, और क्या इसके लिए F# इस्तेमाल करने वाली कंपनियाँ हैं
मैंने F# कभी इस्तेमाल नहीं किया, लेकिन एक ऐसी साइट मिली जो अच्छा resource लगती है: fsharpforfunandprofit.com
Linux/MacOS पर F# की स्थिति कैसी है, यह जानने की उत्सुकता है। क्या यह सिर्फ Windows के लिए है, या फिर पूरी तरह supported भाषा जैसा महसूस होता है?