5

我有一个 type 列表IList<Effort>。模型 Effort 包含一个float被调用的Amount. 我想Amount在 F# 中返回整个列表的总和。这将如何实现?

4

4 回答 4

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

Seq.fold赞成、 pipelinedSeq.fold和 pipelined的答案Seq.sumBy(我最喜欢第三个)。

也就是说,没有人提到这seq<'T>是 F# 的名称IEnumerable<T>,因此Seq模块函数适用于任何IEnumerable,包括ILists。

于 2010-04-03T18:14:57.747 回答
4
Seq.fold (fun acc (effort: Effort) -> acc + effort.Amount) 0.0 efforts
于 2010-04-03T15:30:26.737 回答
4

可能有趣的一个细节是您也可以避免使用类型注释。在sepp2k的代码中,您需要指定该effort值具有 type Effort,因为编译器正在从左到右处理代码(effort.Amount如果不知道类型,它将在调用时失败)。您可以使用流水线运算符编写此代码:

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

现在,编译器知道 的类型,effort因为它知道它正在处理efforts类型的集合IList<Effort>。这是一个小的改进,但我认为它非常好。

于 2010-04-03T16:56:15.077 回答