【发布时间】:2010-04-03 15:19:32
【问题描述】:
我有一个IList<Effort> 类型的列表。模型 Effort 包含一个名为 Amount 的 float。我想在 F# 中返回整个列表的 Amount 的总和。这将如何实现?
【问题讨论】:
我有一个IList<Effort> 类型的列表。模型 Effort 包含一个名为 Amount 的 float。我想在 F# 中返回整个列表的 Amount 的总和。这将如何实现?
【问题讨论】:
efforts |> Seq.sumBy (fun e -> e.Amount)
【讨论】:
赞成Seq.fold、流水线Seq.fold和流水线Seq.sumBy的答案(我最喜欢第三个)。
也就是说,没有人提到 seq<'T> 是 F# 对 IEnumerable<T> 的名称,因此 Seq 模块函数适用于任何 IEnumerable,包括 ILists。
【讨论】:
Seq.fold (fun acc (effort: Effort) -> acc + effort.Amount) 0.0 efforts
【讨论】:
一个有趣的细节是你也可以避免使用类型注解。在 sepp2k 的代码中,您需要指定 effort 值的类型为 Effort,因为编译器正在从左到右处理代码(调用时会失败) effort.Amount 如果它不知道类型)。您可以使用流水线运算符编写此代码:
efforts |> Seq.fold (fun acc effort -> acc + effort.Amount) 0.0
现在,编译器知道effort 的类型,因为它知道它正在处理efforts 类型的IList<Effort> 集合。这是一个小的改进,但我认为它相当不错。
【讨论】: