如何在 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
假设我在 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