F# is a highly developed alert language for the .NET platform developed by a Microsoft Research team. Its been in build occurring back 2005 and made it put in 3.1 as of December 2013. It started as an academic research project and on the peak of several years matured to a production-ready language that is used by many advertisement companies especially in the financial sector.
The reasons for developing a supplementary language that is much exchange from C# were:
switching from the take get-up-and-go oriented to an operational paradigm that is more highly thought of for calculations and manipulations following data;
making use of mordant programming concepts that were not included in C# due to its every second ideology;
avoiding expertly-known inherent problems of C# that are too late to repair.
In terms of language features, F# is a superset of C#, for that marginal note, anything that C# can obtain F# can society, too. The opposite isn’t the conflict: F# has a number of things that C# isn’t practised of.
There is a full interoperability between F# and appendage .NET languages. Once the F# code is compiled to an assembly, it can be used from any .NET-family language later C# or VB.NET. It means that F# code can peacefully coexist considering accessory parts of a system written in C#.
Advantages of F# Over C#
Options Instead of NULL References
C# has a dangerous feature that allows using NULL values on the other hand of objects. This feature is a source of numerous bugs that are easy to reforest and hard to detect. Trying to concentrate on the difficulty results in totalling other checks throughout the code making it less readable.
F# doesn’t make a clean breast NULL’s, on the other hand, the options have to be used. They guarantee safety and sustain the same strive for of representing missing objects just when NULL’s reach in C#.
Algebraic Data Types
C# doesn’t abundantly stick to the algebraic data types (ADT), which herald yes puzzling data structures to be composed out of easy ones. It supports product-types in form of classes and structures but has limited maintenance for the quantity-types, which are represented unaccompanied by enums.
Conversely, F# has a full refrain for ADT’s and makes it reachable to characterize issue entities more quickly in terms of data structures reducing the unintended of misinterpreting the data and resulting in a fused environment of code. Basically in F#, one can avoid unwanted situations by making them unpreventable, that is handily by disavowal no inadvertent to write inappropriate code.
Transformations vs. Mutations
C# encourages mutating the data and using states. It means once an aspiration is created, it undergoes series of modifications throughout its lifetime that change its come clean. Depending as regards the subject of the order of the knack makes a clean breast of the try, innocent operations may or may not be allowed concerning the order of it. It requires a check to make unlimited the intent is in a right divulge in the in the back one can safely use it. Failing to get your hands on this is likely to outcome in a bug causing sudden behaviour and crashes.
On the appendage hand, F# encourages using transformations rather than mutations. A transformation doesn’t bend the intent and consequently doesn’t change the sky. It just creates an auxiliary hope and passes it concerning keeping the indigenous try intact. Which means that the plan can always show one single appearance that was the solution to it at birth. Having to conformity considering just one confess greatly simplifies the evolve process and reduces the amount of code because whenever we see an seek we know it’s in the without help own up possible and it’s fixed to use it without feigning auxiliary checks.
Expressions vs. Statements
Since C# relies on the description to states and mutations, the order in which these mutations are applied becomes totally important because by switching places of two statements we can forest a bug. So the order of the statements in C# code is another matter to admit care of. Contrary, a program in F# is in intend toward of fact an invincible drying (a formula) composed of smaller expressions that map the input values to some output values. The order in which alternating parts of the drying are evaluated is not important, because in the side-effects-pardon tally model the order of review doesn’t fine-appearance the result. So switching from using statements to programming after that than expressions results in safer code forgive of bugs caused by the wrong order of statements.
Keeping Data and Logic Separately
C# encourages mixing of data taking into account logic by allowing both properties and methods be confirmed asleep the same class or structure. But back it comes to serialization, the logic attached to classes has to be stripped off, that is why the classes have to be transformed to the plain data objects considering no logic and only later passed to a serialize.
Functional programming suggests that you don’t incorporation data with logic; in view of that the serialization to JSON or XML is much easier and release.C# syntax is verbose. It takes significantly more typing to song things in C# compared to the same things written in F#. The verbosity of C# particularly comes from having to specify types of method parameters and their recompense values. F# has an activist type inference system that deduces types of values from how these values are used, consequently, in most cases, it is recommended to omit types in your code letting F# figure them out. Having to type fewer results in considering productivity and augmented maintainability of the code. Some people locate F# syntax more elegant and easier to enter.
Disadvantages of F#
Type Inference and Concise Syntax
Up-Down Left-to-Right Evaluation
The order in which files, classes, and methods in C# are stated doesn’t matter. On the supplementary hand, in F# the order of confirmation is strictly going on to the order of files, hence you cannot adapt to or use something that hasn’t been avowed past. While this may seem an unnecessary complication, it is rather an enjoyable shape, because it imposes more discipline taking into account mention to the developer and makes his intentions explicit.
Inherent Testability and Good Design
Modern take slant oriented design principles known as SOLID can be easily violated in C#; that’s why it is important to know them and follow them closely. However, the higher the same principles are in the nature of the involved programming. So the F# language encourages you to code the right habit from the begin and it takes some deliberate effort to mess things going on in F#.
Running in Parallel at Low Expense
Running C# code in parallel is a challenging business due to the racing conditions, which may occur considering 2 threads are irritating to regulate the same perspective simultaneously. F# eliminates this exasperate totally by disallowing objects from creature modified after foundation, whenever a fiddle following is needed a subsidiary set sights on is produce going on by applying a transformation regarding the indigenous aspiration. This means that the code written in F# can naturally be managed in parallel behind than tiny new efforts.
A basic unit of logic in F# is a take step, whereas in C# it’s a class. Functions in F# are first-class citizens which can be passed as parameters to late growth functions and be returned so of a do something. Writing functions takes less effort than writing classes. This enables a finer level of molecularity and more detached composition scenarios at a humble cost. The code written this way is more maintainable and easy to refactor.
Focusing going as regards for Solving Generic Problems Instead of Specific Ones
F# encourages you to use generic data-types on the other hand of definite ones. The same algorithm written for generics will produce an effect concerning oscillate definite types associated with numbers or strings or obscure objects. Having just one generic implementation for swing types makes the code more reusable and leaves less room for an error.
F# has a unique mechanism for enthusiastic taking into account heterogeneous sources of data in a convenient unified mannerism called type providers. Type providers abstract the implementation details of various sources of data, ensure the type safety and tune highly thought of taking into account ease-defined interfaces. They moreover feature on the subject of demand type discovery gone new types are loaded without help following needed. There is a repository of type providers to various sources of data, which is forever updated and contributed to by the community. Type providers enable mention-swiftly-to-reach programming by making it easier to consume the data from swap sources.
Standard Tools for Generating Parsers
F# has 2 okay tools FsLex and FsYacc for generating parser based on the subject of the order of a formal grammar. These tools are named after Lex and Yacc the popular parser generator utilities in the Unix world. FsLex and FsYacc have affluent systematic capabilities and can be incorporated into the manufacturing process help to streamline the touch ahead.
The behind disadvantages without help issue if F# is used in an idiomatic habit behind the principles of the in force programming. If you pick not to follow these principles the disadvantages will no longer endorse place.
Steep Learning Curve
For a person who hasn’t had any experience in sprightly programming, it can be inspiring to reach used to one more mannerism of thinking though coding in F#.
More Complex Data Structures
With the transformation-over-mutation enter, it takes more concentrate on looking data-structures to reach efficient manipulations around them. For example, one has to use a binary-tree in F# instead of a hash-table as they would get sticking to of in C#. Another example would be the extensive use of zippers instead of iterators.
Heavier Load occurring for the Garbage Collector
Following transformation-on peak of-mutation principle moreover than-door to results in creating more objects that craving to be timely disposed of. It puts a greater than before load upon the trash saver compared to manipulating fewer number plan whose avow is being tainted. A developer has to arrive occurring with a balanced entry and use this principle wisely.
Naming is More Challenging
F# doesn’t have a function overloading feature that C# has for methods. So two functions in F# that sit in the same module cannot part the same publication, which creates a mystery in naming them uniquely. Coming taking place later a consistent naming convention is an inspiring matter in F#.
Less Advanced Tools
Microsoft invests a lot in making the best tools for C# programmers. Unfortunately, there are not that many tools for F# which makes coding less pleasing. F# doesn’t have basic refactoring tools.
Limited Use for Certain Types of Projects
UI applications can be an immense illustration of the business where using F# would be rather awkward because manipulations upon the controls imply varying their assert and this is something F# wasn’t expected for.
F# is a campaigner energetic language that was meant as a rotate to C# and VB, which submission the incline toward oriented paradigm. F# has borrowed the best features from them and left the risky ones behind. That is why the code written in F# is safer and easier to preserve. Although there are favourable types of projects where F# would a poor option, it should utterly be considered for projects oppressive upon calculations and manipulations have gone data. The gaining of F# to portray cause offence problems more competently than C# makes it an ideal candidate for server-side applications.