OCAML在整数列表中总结值



我在下面的代码中面临语法错误:

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]

所以我认为我要朝着正确的方向进行此操作,我不明白的是为什么这个错误不断弹出?

let counter语句中缺少关键字in

另一个将在以下情况下弹出的错误: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;;

您只是忘记了第4行中的in键作品。

但是,OCAML是一种功能性语言,您正在尝试使用命令式方法。

即使在解决语法错误时它将起作用,但这并不是您在OCAML中执行此操作的方式。例如,可以通过以下内容完成概括整数列表元素的函数:

let sum = List.fold_left (+) 0;;

甚至

let sum = List.reduce ~f:(+);;

如果您使用的是核心库。

编辑

阅读了另一个答案下的评论后,我了解了您的确试图做的事情:

# 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;;

代码不仅要计算总和本身更为复杂,但是它可以解决问题。

最新更新