2

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)
4

2 に答える 2