4

F#の最新リリースを深く掘り下げながら、PLINQと相互作用させようとしました。ただし、コード的には、この2つがうまく連携していないことに気づきました。実際、次のようなコードを書くことは不可能のようでした。


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

まだ.NET4.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アセンブリでは、いくつかのヘルパー関数を使用できます。

于 2009-05-28T19:18:23.460 に答える
1

拡張メソッドは、オブジェクトを最初のパラメーターとして受け取る単なる静的メソッドであるため、次のコマンドで呼び出すことができるはずです。

ParallelEnumerable.AsParallel(someArray).Count(...)
于 2009-05-28T20:39:27.603 に答える
1

私の記憶が正しければ、PLINQをF#とうまく連携させることは、Microsoftの開発チームのやることリストに載っていますが、.NET4.0に表示されるかどうかはわかりません。ただし、F#には非同期ワークフローがあります。これはPLINQと非常によく似ています(ただし、リスト内包表記に基づいている点が異なります。これは、標準の機能的な方法です)。Parallel Extensions(PLINQ / TPL)のF#でのより良いサポートについて言及している記事が見つからないようですので、引用しないでください。ただし、どこかで見たと確信しています。

MSDNページは別として、この記事はこのトピックの良い入門書のようです。

このブログシリーズF#でのPLINQの使用)もあります。非同期ワークフローよりもPLINQを引き続き使用する場合は、このブログシリーズを読むと便利です。

于 2009-05-28T18:56:29.200 に答える