ONLY DO WHAT ONLY YOU CAN DO

こけたら立ちなはれ 立ったら歩きなはれ

F# で Project Euler Problem 7

素数を小さい方から6つ並べると 2, 3, 5, 7, 11, 13 であり, 6番目の素数は 13 である.

10 001 番目の素数を求めよ.

By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13.

What is the 10 001st prime number?

Scala版をそのまま移植

> exception WhileBreak of unit;;
 
exception WhileBreak of unit
 
> let mutable prime_list = [2];;
 
val mutable prime_list : int list = [2]
 
> let mutable cnt = 1;;
 
val mutable cnt : int = 1
 
> let mutable num = 3;;
 
val mutable num : int = 3
 
>
- while (cnt < 10001) do
-     let num_sqrt = sqrt (float num)
-     let mutable fPrime = true
-     try
-         prime_list
-         |> List.iter (fun p ->
-             if ((float p) > num_sqrt) then
-                 raise (WhileBreak ())
-             elif (num % p = 0) then
-                    fPrime <- false
-                    raise (WhileBreak ())
-            )
-     with _ -> ()
-
-     if fPrime then
-         prime_list <- List.append prime_list [num]
-         cnt <- cnt + 1
-     num <- num + 2
- ;;
 
          |> List.iter (fun p ->
  ----------------------^
 
stdin(11,23): error FS0407: The mutable variable 'fPrime' is used in an invalid way. Mutable variables cannot be captured by closures. Consider eliminating this use of mutation or using a heap-allocated mutable reference cell via 'ref' and '!'.

クロージャになっちゃってるのか?

> exception WhileBreak of unit;;
 
exception WhileBreak of unit
 
> let mutable prime_list = [2];;
 
val mutable prime_list : int list = [2]
 
> let mutable cnt = 1;;
 
val mutable cnt : int = 1
 
> let mutable num = 3;;
 
val mutable num : int = 3
 
> let mutable fPrime = true;;
 
val mutable fPrime : bool = true
 
>
- while (cnt < 10001) do
-     let num_sqrt = sqrt (float num)
-     fPrime <- true
-     try
-         prime_list
-         |> List.iter (fun p ->
-             if ((float p) > num_sqrt) then
-                 raise (WhileBreak ())
-             elif (num % p = 0) then
-                    fPrime <- false
-                    raise (WhileBreak ())
-            )
-     with _ -> ()
-
-     if fPrime then
-         prime_list <- List.append prime_list [num]
-         cnt <- cnt + 1
-     num <- num + 2
- ;;
val it : unit = ()
> prime_list.[prime_list.Length-1];;
val it : int = 104743
> ;;

Scala版 より高速!