【问题标题】:How do you work with IList<> in F#?您如何在 F# 中使用 IList<>?
【发布时间】:2010-04-03 15:19:32
【问题描述】:

我有一个IList&lt;Effort&gt; 类型的列表。模型 Effort 包含一个名为 Amountfloat。我想在 F# 中返回整个列表的 Amount 的总和。这将如何实现?

【问题讨论】:

    标签: f# sum ilist


    【解决方案1】:
    efforts |> Seq.sumBy (fun e -> e.Amount)
    

    【讨论】:

    • 问这个问题后不久,我记得我应该使用 Seq 而不是 List 并得出与您相同的结论。 "成员 x.TotalEffort = x.Effort |> Seq.sumBy(fun i -> i.Amount)"
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:
      Seq.fold (fun acc (effort: Effort) -> acc + effort.Amount) 0.0 efforts
      

      【讨论】:

        【解决方案4】:

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

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

        现在,编译器知道effort 的类型,因为它知道它正在处理efforts 类型的IList&lt;Effort&gt; 集合。这是一个小的改进,但我认为它相当不错。

        【讨论】:

          猜你喜欢
          • 2013-11-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-14
          • 2012-02-27
          • 2019-01-19
          • 2021-09-23
          相关资源
          最近更新 更多