OCaml: Почему этот код выдает ошибку проверки типа?

Вот мой код:

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

person Nick Heiner    schedule 09.09.2009    source источник


Ответы (1)


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);;
person bcat    schedule 09.09.2009