• [^] # Re: Exemple judicieux ?

    Posté par . En réponse à la dépêche Apprendre la programmation fonctionnelle avec le MOOC OCaml. Évalué à 1.

    Il est vrai que j'ai mal présenté la chose. Disons que par rapport à une liste, il n'y a pas besoin de valeur initiale car l'arbre contient déjà tout ce qui lui faut pour faire un reduce via la fonction g. Et le fold que j'ai écrit est une généralisation d'un map+reduce.

    let fold_map f g init = function
     | [] -> failwith "empty list"
     | x::xs -> 
     let rec loop acc = function
     | [] -> acc
     | hd::tl -> loop (g acc (f hd)) tl
     in loop (g init (f x)) xs
    ;;
    val fold_map : ('a -> 'b) -> ('c -> 'b -> 'c) -> 'c -> 'a list -> 'c = <fun>
    fold_map (string_of_int) (fun s s' -> Printf.sprintf "(%s + %s)" s s') "1" [2; 3];;
    - : string = "((1 + 2) + 3)"
    (* à comparer avec cette version sur les arbres *)
    let t = Node (Node (Leaf 1, Leaf 2), Leaf 3) in show_p t;;
    - : string = "((1 + 2) + 3)"

    Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.