In a previous blog, I wrote how to get all the prime numbers from 1 to 1,000,000 using C# and LINQ technology. This blog shows you how to do the same thing in F# without using LINQ at all.
A lot of what LINQ gives you is already built into F#, so you don't really need it. The collection functions in F# come with functions that operate on predicates just like LINQ. For example, the filter function in F# list collections are the same as using a WHERE clause in LINQ. Linq is just a little bit easier to understand and less hassle if you already know C#. But look at the equivalent code in F#. It's only a few lines!
// open the system namespace of .NET
open System;
// assign the upperbound
let x = 1000000;;
// we only need the square root of the upper bound to eliminate factors
let upperBound = Convert.ToInt32(Math.Sqrt(Convert.ToDouble(x)));;
// get a reference to a list of all integers from 1 to 1,000,000
// (in other words, get a mutable list)
let allNumbers = ref [1..x] in
// loop through all numbers from 1 to the square root of 1,000,000.
// keep removing numbers that have more than 1 factor
for div = 2 to upperBound do
allNumbers := List.filter(fun num -> (num % div <> 0 or div >= num))
!allNumbers
done;
// print out the results
print_any(allNumbers);;
Note that the techniques used in this article are very similar to those already described by Matt in the lazy evaluation of primes with C#.