Ocaml在整数列表中汇总值

时间:2016-12-29 11:03:17

标签: syntax 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]

所以我认为我正朝着正确的方向前进,我不明白为什么这个错误不断涌现?

2 个答案:

答案 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;;

代码比仅计算和本身更复杂,但它可以解决问题。