如何在OCaml中汇总浮点数列表

Bom*_*ori 1 ocaml

我对我的代码感到困惑:

let sum l = match l with
  | [] -> 0.0
  | h::t -> h +. (sum t);;
Run Code Online (Sandbox Code Playgroud)

它应该给我列表中的数字总和.但是,当我检查代码时,我发现第二个代码在使用长度大于或等于7的列表时崩溃.这是代码:

# sum [0.;1.;2.;3.;4.;5.;]

- : float = 15.

# sum [0.;1.;2.;3.;4.;5.;6.]

- : float = 21.
# sum [0.;1.;2.;3.;4.;5.;6.;7.]

- : float = 21.
Run Code Online (Sandbox Code Playgroud)

我真的很困惑,因为对int进行操作的修改结果是正常的:

let rec sumf l = match l with
  | []-> 0.0
  | h::t-> (float_of_int h) +. sumf t;;
Run Code Online (Sandbox Code Playgroud)

除了我在第二个代码中将int转换为float之外,我不知道两者之间的本质区别是什么.

Gil*_*il' 8

let sum l=
match l with
[]->0.0
|h::t-> h+. (sum t);;
Run Code Online (Sandbox Code Playgroud)

由于您未在rec此处使用关键字,因此sum在最后一行中的调用是sum对您事先定义的函数的调用.显然这个sum功能是错误的.


cag*_*ago 6

我不明白为什么你的代码崩溃了.当我sumrec关键字尝试你的函数时,我没有任何问题,否则你不能递归调用sum函数.

let rec sum l = 
  match l with 
   [] -> 0. 
  | h :: t -> h +. (sum t);;
Run Code Online (Sandbox Code Playgroud)

您还可以使用fold_left模块中的功能List:

let sum l = List.fold_left (+.) 0. l;;
Run Code Online (Sandbox Code Playgroud)