4

在深入研究 F# 的最新版本时,我尝试让它与 PLINQ 交互。然而,我注意到两者在代码方面并没有很好地结合在一起。事实上,编写如下代码似乎是不可能的:


open System.Linq
let someArray = [|"abc"; "def"|]
someArray.AsParallel().Count(new Func<_,_>(fun s -> s.Length = 3))

因为 System.Linq.ParallelEnumerable 类中包含的 ParallelQuery 的扩展方法似乎没有被 F# 采用。
如果根本不支持扩展方法,我不会感到惊讶,但是由于我可以访问为 IEnumerable 定义的 someArray.Count 扩展方法,我想知道为什么我不能访问 PLINQ 的扩展方法。
我错过了什么吗?
这是 F# 限制吗?如果是这样,是通过设计吗?如果没有,是否会在未来的版本中解决?

4

3 回答 3

3

如果你还没有使用 .NET 4.0,你可以这样写:

#r "System.Threading"
open System.Linq

let someArray = [|"abc"; "def"|]

someArray.AsParallel<string>()
|> Seq.filter (fun s -> s.Length = 3)
|> Seq.length

来到 .NET 4.0,你可以写:

let someArray = [|"abc"; "def"|]

someArray
|> Array.Parallel.filter (fun s -> s.Length = 3)
|> Array.length

F# 更喜欢使用 Seq 模块而不是 Linq 扩展方法。但是,在 FSharp.PowerPack.Linq 程序集中有一些辅助函数可用。

于 2009-05-28T19:18:23.460 回答
1

如果我没记错的话,让 PLINQ 与 F# 很好地协同工作是 Microsoft 开发团队的待办事项,尽管我不确定它是否会出现在 .NET 4.0 中。然而, F# 确实有Asynchronous Workflows,它与 PLINQ 非常相似(除了它基于列表推导,这是标准的函数式做事方式)。我似乎找不到提到在 F# 中更好地支持并行扩展 (PLINQ/TPL) 的文章,所以不要引用我的话,但我很确定我在某处看到它。

除了 MSDN 页面,这篇文章似乎是对该主题的一个很好的介绍。

如果您仍然喜欢使用 PLINQ 而不是 Async Workflows,那么还有这个博客系列在 F# 中使用 PLINQ)可能会很方便阅读。

于 2009-05-28T18:56:29.200 回答
1

扩展方法只是将对象作为第一个参数的静态方法,因此您应该可以使用

ParallelEnumerable.AsParallel(someArray).Count(...)
于 2009-05-28T20:39:27.603 回答