• [^] # Re: Version fonctionnelle

    Posté par . En réponse à la dépêche OCaml 4.00.0 est sorti. Évalué à 5. Dernière modification le 17 août 2012 à 19:17.

    Il y a grosso-modo deux raisons: la première, c'est qu'il est possible en OCaml de faire une fonction qui prend un n-uplet d'argument, comme en C, et de tout programmer comme cela:

    (* val process_file : (in_channel -> 'a) * string -> 'a *)
    let process_file (f, filename) =
     let ic = open_in filename in
     let answer = f ic in
     close_in ic;
     answer
    
    

    Tu peux généraliser la fonction précédente au nombre d'arguments que tu veux. Le compilateur natif d'OCaml est d'ailleurs assez intelligent pour compiler de la même façon un appel f x y et un appel f (x,y) au niveau du code assembleur, c'est donc uniquement un choix du programmeur.

    La seconde raison, c'est effectivement qu'il est parfois très pratique d'écrire des fonctions auxquelles on ne fournit pas tous les arguments: par exemple, si je définis une fonction println : out_channel -> string -> unit, je peux la faire itérer sur un répertoire pour afficher tous ses éléments de la façon suivante, puis définir des fonctions spécialisées pour stderr et stdout:

    let println oc filename = output_string oc filename; output_char oc '\n'
    let print_dir oc dirname = 
     Array.iter (println oc) (Sys.readdir dirname); 
     flush oc
    let print_dir_err = print_dir stderr
    let print_dir_out = print_dir stdout
    let _ = print_dir_err "/home"
    
    

    Le même programme à la C:

    let println (oc, filename) = output_string oc filename; output_char oc '\n'
    let print_dir (oc, dirname) = 
     Array.iter (fun filename -> println (oc, filename) ) (Sys.readdir dirname); 
     flush stderr
    let print_dir_err filename = print_dir (stderr, filename)
    let print_dir_out filename = print_dir (stdout, filename)
    let _ = print_dir_err "/home"
    
    

    Personnellement, je trouve la version avec l'application partielle beaucoup moins verbeuse, mais les deux sont aussi efficaces l'une que l'autre…