http://projecteuler.net/index.php?section=problems&id=7
素数判定は2から順に割っていきます。
let count start = Seq.initInfinite (fun n -> n + start) let is_prime n = Seq.forall (fun p -> n % p <> 0) (Seq.takeWhile (fun p -> p * p <= n) (count 2))
takeWhileが使いたいのでListでなくSequenceにします。takeWhileで切られるまでの整数で全て割り切れたらpは素数です。全てというのがforallです。第2引数のSequenceから出てくる要素に第1引数の関数を作用させてどれかがfalseになればそこで打ち切ってfalseを返すはずです。
let count start = Seq.initInfinite (fun n -> n + start) let is_prime n = Seq.forall (fun p -> n % p <> 0) (Seq.takeWhile (fun p -> p * p <= n) (count 2)) let primes = Seq.filter is_prime (count 2) let N = 10001 printfn "%d" (snd (Seq.head (Seq.filter (fun x -> fst(x) = N) (Seq.zip (count 1) primes))))