如何在 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)