【问题标题】:OCaml: How does List.fold_left work?OCaml:List.fold_left 是如何工作的?
【发布时间】:2025-12-29 07:30:16
【问题描述】:

我正在尝试查找浮点数列表的平均值。

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 中迭代列表的首选方法是什么?

【问题讨论】:

    标签: list floating-point ocaml


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      正如 Chuck 所提到的,整数和浮点数之间没有自动转换。此外,要成为浮点文字,它必须有小数点或指数符号。

      所以要修正你的代码,你需要在 0 后面加上一个小数点,使它成为一个浮点常量;您还需要将长度从 int 转换为 float:

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

      【讨论】: