3

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

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

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

顶层返回此错误:

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

4

2 回答 2

8

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

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

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

于 2009-09-05T19:49:22.100 回答
5

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

因此,要修复您的代码,您需要在 0 中添加一个小数点以使其成为浮点常量;并且您还需要将长度从 int 转换为 float:

let avg l =
    List.fold_left ( +. ) 0. l /. float_of_int (List.length l);;
于 2009-09-05T20:06:04.983 回答