gpt4 book ai didi

list - 如何递归地添加 F# 列表中的所有元素?

转载 作者:行者123 更新时间:2023-12-01 12:37:21 26 4
gpt4 key购买 nike

我是 F# 的新手,所以我一直在尝试对文本文件中的所有元素(双整数)行求和,以打印出年份和元素总数。

(来自文本文件的样本):

2010    **(the elements)->** 1.07   1.56    1.74    3.84    6.8 7.89    9.2 3.46    1.67    2.22    2.49    2.81

但是,这是我的递归函数,用于对所有元素求和。我在下面的代码中得到了主要的解释。

let rec sum values:double list =
if values = [] then
[]
else
values.Head + sum values.Tail

let main argv =
// read entire file as list of strings:
let file = ReadFile "rainfall-midway.txt"

let (year, values) = ParseLine file.Head
printfn "%A: %A" year (sum [values]) // values gets the error which i cannot understand at all.

Error 1 The type 'float list' does not support the operator '+'

最佳答案

如果您只是想完成工作,List.sum 很简单,不会溢出堆栈。

Gustavo 给出了一个良好的开端,但如果您要对很多很多值求和,您可能会溢出堆栈。你没有提到你可能需要多少值,但如果它足以溢出堆栈,你会想要切换到尾递归实现(参见 tail callF# Tail Recursive Function Example ):

let sum (values: double list) =

let rec sum values accum =

match values with
| [] -> accum
| head :: tail -> sum tail (accum + head)

sum values 0.0

通过这个实现,我可以成功地对包含一百万个或更多值的列表求和,而不会溢出堆栈。

如果您想进一步加深理解,可以查看 List.fold 的源代码因为它是一种在列表上应用函数(甚至 (+))的更通用的方法。

List.sum 的实现利用了 Seq.sum,它显示了在一个序列上累积一个值,这不一定需要像 这样的实际容器列表,但这显然不在所述问题范围内。

关于list - 如何递归地添加 F# 列表中的所有元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28486162/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com