2009-09-05 7 views
3

J'essaie de trouver la moyenne d'une liste de flottants.OCaml: Comment fonctionne List.fold_left?

let avg l = 
    List.fold_left (+.) 0 l /. List.length l;; 

Comment fonctionne List.fold_left? (Applique le premier argument à une liste (la troisième arg) ... mais ce qui est le second argument?)

Toplevel retourne cette erreur:

Characters 43-44: 
     List.fold_left (+.) 0 l /. List.length l;; 
          ^
Error: This expression has type int but is here used with type float 

Quel est le moyen préféré pour itérer à travers un liste dans OCaml?

Répondre

8

Le deuxième argument est la valeur initiale de l'accumulateur. Pour un pli gauche, vous pouvez le placer visuellement à gauche de la liste. Donc, pour une gauche fois sur [1;2;3;4;5] avec une valeur initiale de 0, il fonctionne à:

((((0 + 1) + 2) + 3) + 4) + 5 

Donc dans ce cas, la parenthèse la plus interne fonctionne à (0 +. 1.0), qui ne fonctionnera pas en OCaml parce que 0 est un int et la langue ne le convertit pas automatiquement en un float pour vous.

5

Comme Chuck mentionné, il n'y a pas de conversion automatique entre ints et flotteurs. De plus, pour être un littéral float, il doit avoir un point décimal ou être en notation exponentielle. Donc pour corriger votre code, vous devez ajouter un point décimal au 0 pour en faire une constante flottante; et vous devez également convertir la longueur d'un int en un flotteur:

let avg l = 
    List.fold_left (+.) 0. l /. float_of_int (List.length l);; 
Questions connexes