The following F# code gives the correct answer to Project Euler problem #7:
let isPrime num =
    let upperDivisor = int32(sqrt(float num))   // Is there a better way?
    let rec evaluateModulo a =
        if a = 1 then
            true
        else
            match num % a with
            | 0 -> false
            | _ -> evaluateModulo (a - 1)
    evaluateModulo upperDivisor
let mutable accumulator = 1   // Would like to avoid mutable values.
let mutable number = 2        // ""
while (accumulator <= 10001) do
    if (isPrime number) then
        accumulator <- accumulator + 1
    number <- number + 1
printfn "The 10001st prime number is %i." (number - 1)  // Feels kludgy.
printfn ""
printfn "Hit any key to continue."
System.Console.ReadKey() |> ignore
- I'd like to avoid the mutablevalues accumulator and number. I'd also like to refactor thewhileloop into a tail recursive function. Any tips?
- Any ideas on how to remove the (number - 1) kludge which displays the result?
- Any general comments about this code or suggestions on how to improve it?