如何在 F# 中使用 List.fold 对相同符号的相邻数字求和

How to sum adjacent numbers of same sign using List.fold in F#

假设我在 F# 中有一个这样的列表:[5,-2, -6, 7, -2, 2, 14, 2]

我想编写一个函数,它将使用 List.fold 到 return 一个新列表,例如 [5, -8, 7, -2, 18]

我的模板是这样的:

let sumAdjacentOfSameSign (lst :int list) : int list =
    let f x y = 
    if x.Length = 0 then
        [y]
    elif System.Math.Sign(x) = System.Math.Sign(y) then ...
    else y :: x


    List.fold f [] lst

我需要填写 ... 部分,但不太清楚如何填写。

对您的代码进行最少的更改,我会这样做:

let sumAdjacentOfSameSign (lst :int list) : int list =
    let f (x : int list) (y : int) =
        if x.Length = 0 then
            [y]
        elif System.Math.Sign(x.Head) = System.Math.Sign(y) then
            (x.Head + y) :: x.Tail
        else y :: x

    List.fold f [] lst
        |> List.rev   // note that you have to reverse the resulting list

但我建议将 f 简化为:

    let f (x : int list) (y : int) =
        match x with
            | head :: tail when
                System.Math.Sign(head) = System.Math.Sign(y) ->
                    (head + y) :: tail
            | _ -> y :: x