这是我的代码:
let avg l =
List.fold_left ( +. ) 0. l /. float (List.length l);;
let variability l =
let xbar = avg l in
let odp = (List.map (fun i -> ((float) i -. xbar) ** 2.0) l) in
let sum = List.fold_left ( +. ) 0. odp in
sum /. (float) length l;;
将此输入到顶层会产生以下结果:
val avg : float list -> float = <fun>
# Characters 107-108:
let odp = (List.map (fun i -> ((float) i -. xbar) ** 2.0) l) in
^
Error: This expression has type float list but is here used with type
int list
我一直在尝试使用它很长一段时间,但我无法弄清楚为什么会产生错误。是否认为l
是一个int列表?
解决方案:(来自下方。谢谢!)
let avg l =
List.fold_left ( +. ) 0. l /. float (List.length l);;
let variability l =
let xbar = avg l in
let odp = (List.map (fun i -> (i -. xbar) ** 2.0) l) in
let sum = List.fold_left ( +. ) 0. odp in
sum /. (float) (List.length l);;
答案 0 :(得分:2)
let xbar = avg l
会将l
推断为类型float list
,这似乎是您想要的。但是,在表达式List.map (fun i -> ((float) i -. xbar) ** 2.0) l
中,您在映射函数中使用(float) i
。 float
的类型为int -> float
,因此i
被推断为类型int
。这会导致l
被推断为类型int list
,无法与float list
统一,从而导致类型检查错误。
我相信最后一行也是错误的。它应该使用List.length
,而不仅仅是length
,而且我认为围绕float
的参数需要括号,而不是float
本身。
此代码应该有效:
let avg l =
List.fold_left ( +. ) 0. l /. float (List.length l);;
let variability l =
let xbar = avg l in
let odp = (List.map (fun i -> (i -. xbar) ** 2.0) l) in
let sum = List.fold_left ( +. ) 0. odp in
sum /. float (List.length l);;