Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OCaml:为什么这段代码会产生类型检查错误?_Ocaml_Typechecking - Fatal编程技术网

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);;