跳慮跋考

興味も思考も行先不明

F#の無限シーケンスで素数列

Haskellでよくある

primes = [2, 3]
       ++ filter (\n -> all (\p -> mod n p /= 0)
                 $ takeWhile (\p -> p*p <= n) primes) [5, 7 ..]

的なやつを。

let infty n m = Seq.initInfinite (fun i -> n + i * m)

let rec primes = seq {
    yield! [2; 3]
    for i in infty 5 2 do
        if Seq.forall (fun x -> i % x <> 0)
                  (Seq.takeWhile (fun x -> x*x <= i) primes)
        then yield i
    }

なんか若干「そういう言語じゃねーから」みたいな感じがしますね。
F#は正格評価の言語なので、C#でいうとIEnumerable<T>とか書く時のごてっとした感じ?