1

这是我的代码:

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

1 回答 1

2

let xbar = avg l导致l被推断为 type float list,这似乎是你想要的。但是,在表达式List.map (fun i -> ((float) i -. xbar) ** 2.0) l中,您(float) i在映射函数中使用。的类型floatint -> float,所以i推断为类型int。这导致l被推断为 type 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);;
于 2009-09-09T01:18:28.743 回答