OCaml:List.fold_left如何工作?

3
我正在尝试找到一组浮点数的平均值。
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个回答

8

第二个参数是累加器的初始值。对于左折叠,您可以在列表左侧将其可视化。因此,在使用初始值为0对[1;2;3;4;5]进行左折叠时,结果如下:

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

在这种情况下,最内层的括号计算结果为(0 +. 1.0),但在OCaml中不起作用,因为0是一个整数,语言不会自动将其转换为浮点数。


5
正如Chuck所提到的,整数和浮点数之间没有自动转换。另外,要成为浮点字面量,它必须具有小数点或处于指数表示法中。
因此,要修复您的代码,您需要在0后添加一个小数点以使其成为浮点常量;您还需要将长度从整数转换为浮点数:
let avg l =
    List.fold_left ( +. ) 0. l /. float_of_int (List.length l);;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接