A good example is a sieve of eratosthenes.
An employee and I wrote similar sieves in C # and F #. The performance of the C # version was almost 10 times slower than its functional counterpart, written by my colleague.
There was probably some inefficiency in the C # version that could be cleared, but the F # version was noticeably faster.
This problem can be written in a functional language.
Hope this helps some.
Edit -
Here is one example of C # using similar functionality for F # List.Partition. I will continue to search for an F # example. I have hundreds of projects in which it may be, it is just a matter of sorting all my things to find it (I keep everything that I have ever experimented with, so it can take a lot of time .. lol)
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ListPartitionTest { public static class IEnumerableExtensions { public static KeyValuePair<IEnumerable<T>, IEnumerable<T>> Partition<T>(this IEnumerable<T> items, Func<T, bool> f) { return items.Aggregate( new KeyValuePair<IEnumerable<T>, IEnumerable<T>>(Enumerable.Empty<T>(), Enumerable.Empty<T>()), (acc, i) => { if (f(i)) { return new KeyValuePair<IEnumerable<T>, IEnumerable<T>>(acc.Key.Concat(new[] { i }), acc.Value); } else { return new KeyValuePair<IEnumerable<T>, IEnumerable<T>>(acc.Key, acc.Value.Concat(new[] { i })); } }); } } class PrimeNumbers { public int Floor { get; private set; } public int Ceiling { get; private set; } private IEnumerable<int> _sieve; public PrimeNumbers(int floor, int ceiling) { Floor = floor; Ceiling = ceiling; } public List<int> Go() { _sieve = Enumerable.Range(Floor, (Ceiling - Floor) + 1).ToList(); for (int i = (Floor < 2) ? 2 : Floor; i <= Math.Sqrt(Ceiling); i++) { _sieve = _sieve.Where(x => (x % i != 0 && x != i)); foreach (int x in _sieve) { Console.Write("{0}, ", x); } Console.WriteLine(); } return _sieve.ToList(); } } class Program { static void Main(string[] args) { System.Diagnostics.Stopwatch s = new System.Diagnostics.Stopwatch(); int floor = 1; int ceiling = 10; s.Start(); PrimeNumbers p = new PrimeNumbers(floor, ceiling); p.Go();
Ian p source share