1

現在、楽しみのためにF#を少し学ぼうとしています。

C#では、データベースの複雑なデータを処理します。このデータには、多くの場合、int、double、stringsがすべて1つの要素に含まれている必要があります。これSystem.Collections.Generic List<T>に最適です。

F#で並列処理を検討しようとしてList<T>いますが、そのためには不変が必要です。これは可能ですか?そして、構文はC#に似ていますvar x = new List<T>か?

ありがとう。

これを編集して、より明確にします。

F#では、クラスまたはレコードの不変のリスト(名前を付ける必要があります)を、C#でListを使用する場合と同じように作成したいと思います。これは、同じ要素でグループ化された文字列、int、doubleを操作できるようにするためです。うまくいけば、これは本当に簡単です。

4

4 に答える 4

3

私は反対票を投じませんでしたが、詳細なしにあなたの質問に答えることは困難でした。

F#では、不変リストが最も頻繁に使用されるデータ構造です。多くの場合、consコンストラクター(::)と空のリストを使用してリストを作成します[]。たとえば[1; 2; 3]、はの構文糖衣です1::2::3::[]。@Brianが提案したリンクをたどると、基本的なリスト処理の詳細を読むことができます。

F#リストに慣れたら、高階関数とリスト内包表記を使用して新しいリストを作成できます。あなたの場合、乱数のリストは次のように生成できます。

let genRand =
    let rand = System.Random()
    fun () -> rand.NextDouble()

/// Creating a list using high-order functions
let genRandList n = List.init n (fun _ -> genRand())

/// Creating a list using list comprehension
let genRandList' n = [ for i in 1..n -> genRand() ]

私はモンテカルロシミュレーションに精通していません。ただし、この記事を読むList.mapと、乱数のリストが生成されたら、リスト要素にいくつかの関数を均一に適用できます。並列処理の目的で、Listの代わりにArrayを使用することをお勧めします。これにより、はるかに高速化されます。配列は要素へのランダムアクセスを可能にするため、異なるスレッドが配列の互いに素な部分に並列に簡単にアクセスできます。配列は変更可能ですが、高階関数と配列の理解により、副作用のない方法で使用できます。

各要素でのタスクが重要であるためには、一連のタスクを1つにマージし、並列処理のためににArray.map変更Array.mapする必要があります。関数Array.Parallel.mapを並列化することもできます。meanただし、スピードアップが得られる可能性はほとんどありません。このスニペットを見て、アレイを使用したソリューションがどのように見えるかを確認してください。

更新

レコードのリストを作成します。

type RandPair = { First: float; Second: float}
let genRandPairs n = [ for i in 1..n -> 
                          { First = genRand(); Second = genRand() } ]

クラスについても同様に行うことができます。

于 2012-09-17T20:59:43.497 に答える
3

リストの使用方法に答える前に、リストを使用する理由を確認すること勧めします。

これは簡単なことではありません。コンピュータサイエンスでリストと呼ばれるものは非常に正確な構造であり、たとえばシーケンスとは異なる意味を持ち、「リスト」のカジュアルな使用法に対応します。C#ではこれはIEnumerableと呼ばれ、F#では別名seqです(これらは同じBCLタイプです)。

シーケンスのこの一般的な機能概念は、配列、リスト、セット、辞書、マップなどのタイプで見ることができます...列挙できるものなら何でも

さまざまな構造を理解するために、動物学のサンプルリスト(エラー..シーケンス)を次に示します。

  • セット自体は順序付けられていませんが、最初の使用法ではなくても列挙できます
  • リストは、各要素が次の要素へのポインターを持ち、スキャンとo(n)ランダムアクセスを可能にする構造です。F#では不変であり、新しいもののみを作成でき、要素を追加することはできません。1方向トラバーサル用のリンクリストと、2方向トラバーサル用の二重リンクリストを作成できます。

  • 配列は、o(1)ランダムアクセスを可能にするメモリの連続ブロックです。コレクションのサイズを事前に知っている場合に適しています。

  • 辞書は配列に似ていますが、整数ではないキーによるインデックスです
  • ResizableArrayは、要素を追加できるという点で、ご存知のc#リストに似ています。

リスト自体に関するすべてがここにあります

http://en.wikibooks.org/wiki/F_Sharp_Programming/Lists

プログラムを理解していれば、この構造を他の構造よりも使用する理由を事前に正当化できるはずです。

プログラムが遅すぎる場合は、o(n)である構造体で「検索」を探してください。つまり、データベースの「フルスキャン」に相当します。正しい構造を取得すると、プログラムが飛ぶようになります

于 2012-09-18T15:42:54.117 に答える
1

あなたはチェックアウトするかもしれません

http://en.wikibooks.org/wiki/F_Sharp_Programming/Lists

また

http://msdn.microsoft.com/en-us/library/dd233224.aspx

于 2012-09-17T04:30:10.693 に答える
1

この質問の文脈では、他の回答で説明されているように不変のF#リストを作成すると、リストが変更されていませんが、それが保持する参照は、おそらく不変ではないオブジェクトを指しています。

とはいえ、たとえそうであったとしても、並列化は自動的には行われません。F#は純粋な言語ではないため、オブジェクトによってどのような副作用が発生するかを確認できず、それ自体では何も並列化できません(自動並列化は、自動並列化であるため、たとえ可能であっても、おそらくあまり効率的なソリューションではありません。それほど簡単ではありません)。

次の質問でうまく説明されています:F#は自動並列処理を提供しますか?

もちろん、問題の詳細がわからないため、これがすべて一般的なことです。

于 2012-09-17T10:14:48.540 に答える