我对我的代码感到困惑:
let sum l = match l with
| [] -> 0.0
| h::t -> h +. (sum t);;
它应该给我列表中的数字总和。但是,当我检查代码时,我发现第二个代码在使用长度大于或等于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.
我真的很困惑,因为对int进行操作的修改结果是正常的:
let rec sumf l = match l with
| []-> 0.0
| h::t-> (float_of_int h) +. sumf t;;
我不知道除了我在第二个代码中将int转换为float之外,两者之间的本质区别是什么。
答案 0 :(得分:8)
let sum l= match l with []->0.0 |h::t-> h+. (sum t);;
由于您未在此处使用rec
关键字,因此在最后一行中对sum
的调用是对您事先定义的sum
函数的调用。显然sum
功能是错误的。
答案 1 :(得分:6)
我不明白为什么你的代码崩溃了。当我使用sum
关键字尝试rec
函数时,我没有任何问题,否则您无法递归调用sum函数。
let rec sum l =
match l with
[] -> 0.
| h :: t -> h +. (sum t);;
您还可以使用模块fold_left
中的List
功能:
let sum l = List.fold_left (+.) 0. l;;