F# で並列フィルタリングを実現するにはどうすればよいですか? Array.Parallel.Choose
基本的には、配列を作成するためにシーケンス式を除いてやりたいと思っています。
私は試した:
Async.Parallel [for x in 1..40 do yield async { if x % 5 = 0 then return x }]
しかし、if は常に値を持っているとは限らない (つまり、Async<unit>
ではないAsync<'a>
) ため、これは型の不一致です。
多数の数値セット (1,000,000,000 +) を反復処理しているため、事前にシーケンスを生成したくありません。
if ステートメントの実際のチェックは次のとおりです。
let isPalindrome (x : int) = let numberArray = x.ToString().ToCharArray()
numberArray = Array.rev numberArray
PSeqを使用してみました:
[for x in 990000..999999 do for y in 990000..999999 do yield (x, y, x*y)]
|> PSeq.filter(fun (x, y, z) -> isPalindrome z)
|> Seq.max
これにより、 が発生しOutOfMemoryException
ます。
醜い回避策:
let numberArray = [|990000..999999|]
let result = numberArray |> Array.Parallel.collect(fun x -> [| for y in numberArray do if isPalindrome (x*y) then yield (x, y, x*y)|])
|> Array.maxBy(fun (x, y, z) -> z)