我正在尝试找到浮动列表的平均值。
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中迭代列表的首选方法是什么?
答案 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);;