5

type のリストがありIList<Effort>ます。モデル Effort には、float呼び出された が含まれていAmountます。AmountF# で、リスト全体の合計を返したいと思います。これはどのように達成されますか?

4

4 に答える 4

7
efforts |> Seq.sumBy (fun e -> e.Amount)
于 2010-04-03T17:01:43.837 に答える
5

Seq.fold、パイプラインSeq.fold化、およびパイプライン化の回答に賛成票を投じましたSeq.sumBy(私は 3 番目の回答が一番好きです)。

seq<'T>とはいえ、が F# の の名前であるとは誰も言及していないIEnumerable<T>ため、Seqモジュール関数IEnumerableは を含む任意IListの で機能します。

于 2010-04-03T18:14:57.747 に答える
4

興味深い点の 1 つは、型注釈の使用を避けることもできるということです。sepp2kによるコードでは、effort値が typeであることを指定する必要がありますEffort。これは、コンパイラがコードを左から右に処理しているためです (effort.Amount型がわからない場合、呼び出しで失敗します)。これは、パイプライン演算子を使用して記述できます。

efforts |> Seq.fold (fun acc effort -> acc + effort.Amount) 0.0  

これで、コンパイラは type のコレクションをeffort処理していることを認識しているため、 の型を認識します。ちょっとした改善ですが、とてもいいと思います。effortsIList<Effort>

于 2010-04-03T16:56:15.077 に答える
4
Seq.fold (fun acc (effort: Effort) -> acc + effort.Amount) 0.0 efforts
于 2010-04-03T15:30:26.737 に答える