OCaml:List.fold_left如何工作?

Nic*_*ner 3 floating-point ocaml list

我试图找到一个浮动列表的平均值.

let avg l =
    List.fold_left ( +. ) 0 l /. List.length l;;
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

Chu*_*uck 8

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

((((0 + 1) + 2) + 3) + 4) + 5
Run Code Online (Sandbox Code Playgroud)

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


new*_*cct 5

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

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

let avg l =
    List.fold_left ( +. ) 0. l /. float_of_int (List.length l);;
Run Code Online (Sandbox Code Playgroud)