我在下面的代码中遇到语法错误:
let sum list =
let current_sum = List.hd list in
for i = 1 to List.length list - 1 do
let counter = List.nth list i
current_sum = current_sum + counter
done;;
我面临的错误就在这里
done;
^^^^
Error: Syntax error
代码应该在每次迭代时总结列表的当前值,例如
sum [1;2;3;4];;
- : int list = [1; 3; 6; 10]
所以我认为我正朝着正确的方向前进,我不明白为什么这个错误不断涌现?
答案 0 :(得分:4)
in
声明中缺少关键字let counter
。
之后会出现的另一个错误:current_sum
是不可变的。你必须改变它。
实现总和的另一种方法:使用List.fold函数。
制定以下评论:
let sum_l l =
let (r,_) = List.fold_left
(fun (a_l, a_i) x -> ((a_i + x) :: a_l , a_i+x))
([],0) l in
List.rev r;;
答案 1 :(得分:2)
您只是忘记了第4行中的in
关键字。
然而,OCaml是functional language,你在这里尝试使用命令式方法。
即使在解决语法错误时它会起作用,但这不是你在OCaml中执行此操作的方式。例如,可以使用以下函数来总结整数列表元素的函数:
let sum = List.fold_left (+) 0;;
甚至
let sum = List.reduce ~f:(+);;
如果您使用的是Core库。
修改强>
在根据另一个答案阅读评论后,我明白了你想要做什么
:# sum [1;2;3;4];;
- : int list = [1; 3; 6; 10]
这是一种方法,使用OCaml的功能特性:
let sum l =
let sums =
List.fold_left (fun l x -> match l with
| [] -> [x]
| h::t -> (x+h)::l) [] l
in List.rev sums;;
代码比仅计算和本身更复杂,但它可以解决问题。