2009-05-28 132 views
4

在深入研究F#的最新版本時,我試圖讓它與PLINQ交互。 但是,我注意到,這兩者在代碼方面並沒有很好的結合。 事實上,它似乎沒有可能寫出的代碼如下所示: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#限制嗎?如果是這樣,是否通過設計?如果不是,它將在未來的版本中解決嗎?

回答

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程序集中有一些輔助函數可用。

1

如果我沒有記錯的話,讓PLINQ與F#很好地協作是在微軟開發團隊的待辦事項列表上,儘管我不確定它會出現在.NET 4.0中。 F#確實有Asynchronous Workflows,這與PLINQ非常相似(除了它是基於列表解析的,而這是標準的功能方式)。我似乎無法找到在F#中爲並行擴展(PLINQ/TPL)提供更好支持的文章,所以不要在此引用我的意思,但我確信我在某處看到了它。

除了MSDN頁面,this article似乎是一個很好的主題介紹。

還有this blog series在F#使用PLINQ)如果你喜歡使用PLINQ在異步工作流仍可能是方便閱讀。

+0

我知道異步工作流,但在一些情況下,他們肯定不是很方便的調用它作爲PLINQ。另外,請你把我的源代碼說明PLINQ + F#按計劃進行了嗎?最後,爲什麼擴展方法會在一種情況下工作(IEnumerable )並在另一箇中斷? – em70 2009-05-28 19:04:45

+0

是的,我同意PLINQ在某些情況下提供更大的範圍和功能。帖子已更新。 – Noldorin 2009-05-28 19:23:32

1

擴展方法只是把對象作爲第一個參數靜,所以你應該能夠

ParallelEnumerable.AsParallel(someArray).Count(...)