Are you ready to learn F#? Concepts to be familiar with before learning the F# language
I have been learning, absorbing and playing with F# for several months now. I worked primarily with C# since 2002. I figured I would write some .NET and developer concepts that one should be familiar with before trying to learn F#. Hopefully, the list compiled below will help you determine if you are ready to learn F#. If you are not familiar with most or any of these items below, it doesn't mean you can't learn (or shouldn't learn) F#. However, in my opinion, the more you know from the items listed below, the easier it will be to learn the language.
F# is a new functional programming language (from Microsoft) that is being released with .NET 4.0 and Visual Studio 2010 in March 2010. The language is a "first-class" language and is completely integrated with the entire .NET ecosystem (debugger, tools, framework, support) like C#, C++.NET and VB.NET. Therefore, F# is not like Delphi.NET, COBOL.NET or other third-rate .NET languages. Functional languages are based on mathematics and this makes them ideal for statistical, financial operations on large data sets. F# is a unique .NET language that will have many uses in the near future.
This is a list of programming concepts you should be familiar with before learning F# (Note: I ommited a lot of beginner programming concepts). You will see a lot of these concepts/patterns used in F# programs and examples.
- Data Structures - You should have a good understanding of the differences between a linked list, array, hash set, etc. F# natively uses certain data structures (in underlying types) and knowing the differences between them will aid you when writing programs. If you need a refresher, check out this FREE PDF book Data Structures and Algorithms Book.
- Big Oh Notation - You have to be able to understand the performance implications of your algorithms. This is especially true for functional programming languages like F#. If you do not know the difference between O(1) or O(n), you need to refresh your memory. This is important when writing functional (non-imperative) style programs when doing many operations on a sequence or list of types.
- Type Inference - By default, the F# compiler uses type inference to determine what types a function uses. C# has partial type inference using the var keyword. However, in C#, you still need to pass in the type explicitly for method signatures. Being used to not seeing these "type aids" will help you understand F# syntax faster.
- Immutability - In object-based languages such as C#, C++ or VB.NET the created objects are mutable. This means that their state can be changed. Functional programming languages are by default immutable and do not allow the state of the value/variable to change after it has been assigned a value. For more information on immutability go here.
- Recursion - Recursion is the ability of a piece of code to call itself over and over until the desired result has been completed. In C#, methods can be recursive. In SQL (SQL 2005), a developer can use CTEs (common table expressions) to recursively iterate through the same algorithms. This pattern is very popular in functional programming and whatever F# book you pick up, this will be one of the first chapters you read. If you are familiar with the more advanced topic of recursion like "tail recursion," that will be really beneficial as well. For more information on recursion, click here.
- Closures - Closures are a more advanced topic that most developers use every day without even knowing it. Closures allow you to use constructs that are declared outside of the scope of the function as if they were part of the local scope. I recommend Jon Skeet's book to fully understand them. A link to an article on his website can be found here.
- Currying -Function/method currying is the process of creating new functions/methods from existing functions/methods and their parameters. You will see function currying in a lot of F# examples as it makes code simpler and easier to read. For more information on currying, click here.
- Iterator pattern - I think this is one of the more important design patterns. For example, as a .NET developer, you should know the difference between a List type and an IEnumerable and how to use the yield keyword to implement the iterator pattern in C# (In F#, an iterator is implemented in a sequence). As mentioned above, functional programming languages are designed to work with lots of data. Therefore, optimizing data structure access is essential to create performant F# modules. For a great article on the iterator pattern, please look at Juwal Lowy's MSDN article.
- Asynchronous Programming - Since F# is by default immutable and tries to get the developer to program without side effects, this makes it great for asynchronous programming. The reason is that by definition, all constructs should be thread-safe since their state cannot change. Knowing about async programming helps, but it does not mean you can't do synchronous F# programs.
- Writing Clean Code - In my opinion, this is probably the most important one of all. When writing C# code, you have curly brackets and semicolons to aid you in laying out your code and determining scope. However, in F#, the way you lay out code matters! This means whitespace and bad code formatting could create unwanted bugs. The reason I mention this as important is that this could be a hard habit to break. For example, learning about closures could take a very small amount of time compared to breaking a bad habit in formatting your code.
- Other functional languages - This is an obvious one. If you have experience with other functional languages such as Haskell or OCaml, you will obviously feel right at home with F#.
.NET/C# Concepts that Translate to F#
This is a list of .NET/C# concepts that translate well into F# and will help you understand functional programming more easily.
- LINQ/SQL - If you have used LINQ or SQL, this will dramatically help you understand how to write functional algorithms. LINQ/SQL favor declerative (opposed to imperative) syntax like F#.
- Lambda Syntax - If you are familiar with lambda syntax in C#, you will see a very similar lambda syntax in F#.
- Extension Methods - This could be associated with knowing LINQ but it is worth mentioning here as extension methods are essential in "fluent" code.
- Generics - Generics were introduced to the .NET framework to aid in code reuse. In the same manner that you can write a generic method in C#, you can write a generic function in F#.
- Delegates and Simplified Delegate Syntax - If you have used delegates as parameters or to pass pieces of code around, then the functional composition concept will be familiar to you in F#. You can read my Evoloution of C# Delegate Syntax article to understand how delegates allow you to write code in a more functional paradigm using C#.
- Parallel Task Library/PLINQ - Writing algorithms that can take advantage of many cores should not be hard. This is exactly what the Parallel Task Library/PLINQ allows you to do in .NET 4.0 in a simpler, functional way. These concepts are closely aligned to F# asynchronous workflows which allow concurrency (even in Silverlight!!)
- var Keyword (type inference) - Being familiar with the var keyword in C# will get you familiar with type inference in F# faster. Most F# examples make use of this feature and declare types explicitly only when needed.
If you read reviews of available F# books, some are negative - in my opinion, unfairly - because the developers expect to be taught everything. There are a lot of core concepts listed above that a single F# resource simply cannot cover. Understand when purchasing F# resources, you are expected to know a decent amount of these developer topics. I hope this list aids you in the way you approach learning F# either by jumping into F# directly or by brushing up on some intermediate/advanced programming concepts.
Getting started with F#
Information on F# has been around for several years. There are many articles, white papers and books on F#. However, you do have to be careful and get content that is recent and relative to the current F# release. The F# specification has changed dramatically over the last several months as the language was being "productized" and many methods/functions simply don't exist in F# anymore. Below are some links I put together where to get started.
- Getting Started with F# - This video (from the 2008 PDC) is the place to start if you have zero F# experience and/or if you want a really good introduction into functional programming and some F# examples.
Books (I have read four different F# books and the two below are by far the best ones and most current. Don Syme's F# book is good but a little outdated.)
- http://www.fsharp.net/- This the main Microsoft F# page. Includes numerous links, downloads for Visual Studio, F# extensions, etc.
- Don Syme's blog - Don Syme is one of the main "creators" of F#. His blog is a must read to get insight into advanced topics and upcoming F# news.