2009-05-28 10 views
4

最新のF#のリリースを掘り下げながら、PLINQとのやりとりを試みました。 しかし、私は2つがコードワイズで一緒にとてもうまく動作しないことに気づいた。 System.Linq.ParallelEnumerableクラスに含まれてParallelQueryのための拡張メソッドは、F#のでピックアップを取得していないようでしたので、F#とPLINQの拡張方法


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

: 実際には次のようなコードを記述することができていないようでした。
IEnumerableに定義されているsomeArray.Count拡張メソッドにアクセスできるため、拡張メソッドのサポートがまったくないと驚くことはありませんが、なぜPLINQのものにアクセスできないのでしょうか?
何か不足していますか?
これはF#の制限ですか?もしそうなら、それはdesingですか?そうでない場合は、今後のリリースで対処される予定ですか?

答えて

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#はの使用を好みますLinq拡張メソッドのSeqモジュールただし、FSharp.PowerPack.Linqアセンブリにはいくつかのヘルパー関数が用意されています。私は非同期ワークフローについて知っているが、いくつかのケースでは、彼らは間違いなくそれほど便利じゃない

+0

署名は( 'T - >' Uオプション) - > 'T array - >'配列であるので、あなたは私に解決策を与えました:AsParallelで型を指定するので、その方法を選択することはできません。実際にはそうでなければ、非ジェネリック版が返されているように見えます。最後に、私はSeq、配列、および他のモジュールがF#で優先されることを知っていますが、いくつかの状況では、配列ではなく、Array.Parallelが提供しないものが必要な場合があります。 – em70

+0

私の悪い、これはしません。 AsParallel を使用した後、拡張メソッドが選択されると、コンパイラは適切なオーバーロードを解決できないため役に立たない。( – em70

+0

Array.chooseエラーについてお詫び申し上げます。投稿した直後に私はそれを見つけましたが、正しいバージョンに編集する前に見つけました。 ;) FYI-in F#、SeqモジュールはIEnumerableを処理し、seqタイプはIEnumerableと同義です。 –

1

私が正しく覚えていれば、PLINQをF#でうまく動作させることは、Microsoftの開発チームの予定リストにありますが、.NET 4.0には表示されません。しかし、F#にはAsynchronous Workflowsがあります。これはPLINQに非常に似ています(代わりにリスト内包をベースにしていますが、これは標準的な処理方法です)。私はParallel Extensions(PLINQ/TPL)のためのF#のサポートについてより詳しく言及している記事を見つけることができないので、私にそれを引用してはいけませんが、私はどこかでそれを見たと確信しています。

MSDNのページとは別に、this articleは、このトピックの良い紹介のようです。

また、PLINQ over Async Workflowsを使いたい場合は、this blog seriesF#でPLINQを使用することもあります)があります。

+0

でそれを呼び出すことができるはずですPLINQとしてまた、PLINQ + F#がスケジュールどおりであることを示す情報源をリンクしてください。最後に、拡張メソッドが1つのケース(IEnumerable )で動作し、別のものが中断するのはなぜですか? – em70

+0

ええ、私はPLINQがいくつかの状況でより広い範囲と機能性を提供することに同意します。投稿が更新されます。 – Noldorin

1

拡張メソッドは、最初のパラメータとしてオブジェクトを取るだけの静的なので、あなたは

ParallelEnumerable.AsParallel(someArray).Count(...) 
関連する問題