After a long Easter holiday filled with late night coding sessions I find myself wide awake at 2am… good job I’ve still got my pluralsight subscription and a quick look at the Algorithms and Data Structures course again at least gave me something to do to relax the mind with some back-to-school style implementation of common sorting algorithms in F#:
Whilst not the most performant implementations I’m sure, I hope at least it goes to show how easily and concisely these simple algorithms can be expressed in F#! Now back to that sleep thing…
This is a F# implementation of the fast algorithm to count the number of inversions in an array, outlined in the Algorithms : Design and Analysis Part 1 course on Coursera.
Here’s a simple F# implementation of the merge sort algorithm (using mutable arrays) outlined in the Algorithms : Design and Analysis Part 1 course on Coursera.
So refreshing to be writing simple sorting algorithms years after university, still fun!
With the official release of .Net 4.5 and Visual Studio 2012, I suspect many .Net developers will be rushing to rewrite their data access or network layers (amongst many many other things!) to take advantage of the new async-await (see the excellent 101 examples here) language feature in C#, which means you’ll likely be working with the Task and Task<T> type an awful lot.
If you have F# code that needs to interop with C# that returns or awaits some task types then you’ve probably already come across the Async.StartAsTask<T> and Async.AwaitTask<T> methods for converting between F#’s Async<T> and Task<T> types. Curiously, there are no equivalent methods on the Async class for converting between Async<unit> and Task types.
So, to fill in the gaps ourselves, here are two simple functions to do just that:
In Erlang, we have the Supervisor behaviour which makes it very easy to provide the means to monitor and restart a whole network of workers and other supervisors based on some configured strategy.
The MailboxProcessor (aka agents) in F# doesn’t come with the same higher-level abstractions (such as Erlang’s gen_server, gen_fsm behaviours) by default, but it’s very easy to mimic some of their capabilities by building on top of the standard F# agents.
Luca Bolognese’s lightweight LAgent framework is a perfect example and even provides interesting possibilities such as hot swapping of code (although still some way off of what’s possible in Erlang in this regard).
Similarly, the following snippet shows how you can start an agent with supervision so that any escaped exceptions (which will crash the agent) are trapped and restarts the agent: