2009-09-09 7 views
1

Voici mon code:OCaml: Pourquoi ce code produit-il une erreur de vérification de type?

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

Entrer dans le présent produit toplevel les éléments suivants:

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 

J'ai essayé de travailler avec ce depuis longtemps, mais je ne peux pas comprendre pourquoi cela produit une erreur. Pense-t-il que l est une liste int?

SOLUTION: (.! Merci d'en bas)

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

Répondre

2

let xbar = avg l provoque l être inférée en tant que type float list, qui semble être ce que vous voulez. Toutefois, dans l'expression List.map (fun i -> ((float) i -. xbar) ** 2.0) l, vous utilisez (float) i dans la fonction de mappage. Le type de float est int -> float, donc i est déduit comme type int. Cela provoque l pour être inféré comme type int list, qui échoue à unifier avec float list, entraînant une erreur de vérification de type.

Je crois que la dernière ligne est également incorrecte. Il devrait utiliser List.length, pas seulement length, et je pense que vous avez besoin de parenthèses autour de l'argument à float, pas float lui-même.

Ce code devrait fonctionner:

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