2017-09-18 4 views
0

Je voudrais enregistrer (imprimer pour l'instant) tous les éléments dans les résultats avant de le réduire pour le retour. Y a-t-il un moyen d'y parvenir?Comment enregistrer tous les éléments d'une liste dans Ocaml avant de renvoyer la liste?

let calculate ~size_of_experiment:s ~number_of_buckets:n = 
    let results = run_experiments s n in 
    List.iter (fun x -> print_endline x) results; 
    List.fold_left (fun x y -> x + (snd y)) 0 results 

Le code ci-dessus compile pas:

Error: This expression has type (int * int) list 
     but an expression was expected of type string list 
     Type int * int is not compatible with type string 

Répondre

1

Votre seul problème semble être que les éléments de la liste sont de type (int * int) et vous les traitent comme des chaînes.

let string_of_int_pair (a, b) = Printf.sprintf "(%d, %d)" a b 

let calculate ~size_of_experiment:s ~number_of_buckets:n = 
    let results = run_experiments s n in 
    List.iter (fun x -> print_endline (string_of_int_pair x)) results; 
    List.fold_left (fun x y -> x + (snd y)) 0 results 

Le problème plus général est que ce serait vraiment agréable d'avoir un moyen d'imprimer des valeurs de différents types sans écrire le code vous-même pour chaque cas. Pour cela, vous pouvez utiliser quelque chose comme deriving.

+0

Merci @jeffrey J'ai complètement oublié ce détail sur Ocaml. – Istvan