OCaml:为什么这段代码会产生类型检查错误?
这是我的密码:OCaml:为什么这段代码会产生类型检查错误?,ocaml,typechecking,Ocaml,Typechecking,这是我的密码: 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 /.
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
让xbar=avg l
导致l
被推断为类型浮动列表
,这似乎是您想要的。但是,在表达式List.map(fun i->((float)i-.xbar)**2.0)l
中,可以在映射函数中使用(float)i
。float
的类型是int->float
,因此i
被推断为类型int
。这导致l
被推断为类型int 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);;
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);;