OCaml:List.fold_left如何工作?

时间:2009-09-05 19:35:48

标签: list floating-point ocaml

我正在尝试找到浮动列表的平均值。

let avg l =
    List.fold_left ( +. ) 0 l /. List.length l;;

List.fold_left如何运作? (将第一个参数应用于列表(第三个参数)......但是第二个参数是什么?)

Toplevel返回此错误:

Characters 43-44:
        List.fold_left ( +. ) 0 l /. List.length l;;
                             ^
Error: This expression has type int but is here used with type float

在OCaml中迭代列表的首选方法是什么?

2 个答案:

答案 0 :(得分:8)

第二个参数是累加器的初始值。对于左侧折叠,您可以直观地将其放置在列表的左侧。因此,对于[1;2;3;4;5]上的左侧折叠,初始值为0,它适用于:

((((0 + 1) + 2) + 3) + 4) + 5

所以在这种情况下,最里面的括号可以用到(0 +. 1.0),这在OCaml中不起作用,因为0是一个int,语言不会自动将它转换为浮点数。

答案 1 :(得分:5)

正如Chuck所说,整数和浮点数之间没有自动转换。此外,要成为浮点字面值,它必须具有小数点或以指数表示法。

因此,要修复代码,需要在0处添加小数点,使其成为浮点常量;你还需要将长度从int转换为float:

let avg l =
    List.fold_left ( +. ) 0. l /. float_of_int (List.length l);;