无法使用带有转换的List.sum

时间:2015-12-27 13:35:36

标签: f#

我无法弄清楚在执行转换的函数上运行聚合器所需的语法。

我有以下代码:

type Suit = | Spades| Clubs | Diamonds | Hearts

type Face = | Two | Three | Four | Five 
            | Six | Seven | Eight | Nine | Ten
            | Jack | Queen | King | Ace

type Card = {Face:Face; Suit:Suit}

我无法编译此函数:

let getCount (hand:Card list) =
    let getFaceValue face =
        match face with
        | Two -> 2
        | Three -> 3
        | Four -> 4
        | Five -> 5
        | Six -> 6
        | Seven -> 7
        | Eight -> 8
        | Nine -> 9
        | Ten -> 10
        | Jack -> 10
        | Queen -> 10
        | King -> 10
        | Ace -> 11

    let sumOfHand = hand |> List.sum (fun c -> getFaceValue c.Face)
    sumOfHand
  

期望支持运营商的类型' +'但是给了一个功能   类型。您可能缺少函数的参数。

为什么我会收到此错误,如何在聚合函数中使用转换?

2 个答案:

答案 0 :(得分:4)

List.sum采用单个参数(列表)并使用+运算符计算所有元素的总和。

要按照应用于列表中每个元素的函数求和,请使用List.sumBy

let sumOfHand = hand |> List.sumBy (fun c -> getFaceValue c.Face)

答案 1 :(得分:2)

您应先映射然后汇总

hand |> List.map (fun x ...) |> List.sum