type base_t
type derived_t
type t =
| BASE of base_t * t list
| DERIVED of derived_t * t list
let rec visitor accumulator t =
match t with
| [] -> List.rev accumulator
| BASE (base_info, suite) :: tail
-> let a = visitor ((foo_base base_info) :: accumulator) tail in
visitor ((foo_base base_info) :: a) suite
| DERIVED (derived_info, suite) :: tail
-> let a = visitor ((foo_base base_info) :: accumulator) tail in
visitor ((foo_derived derived_info) :: a) suite
(*execution : *)
let resultat_list = visitor [] my_data_tree in
...
Et encore, dans le match on peut mettre des bouts d'arbres comme :
| BASE (base_info, BASE (base_info2, []))
Le petit point difficile est l'usage d'une liste dans le type, mais on peut utilisé un type Option pour faire la terminaison de récursion.
Pour info :
(item :: list) permet d'ajouter un item au début d'une list ou de décomposer une liste dans les matchs.
(foo plop) permet d'appliquer la fonction foo au paramètre plop
En conclusion, vive les types sommes et le "pattern matching" d'arbre.
# Dire que certaine pense que le Ocaml est illisible...
Posté par Nicolas Boulay (site web personnel) . En réponse au journal Visiteurs en C++. Évalué à 10. Dernière modification le 24 avril 2013 à 10:56.
Quand on voit la complexité du truc…
Et encore, dans le match on peut mettre des bouts d'arbres comme :
| BASE (base_info, BASE (base_info2, []))
Le petit point difficile est l'usage d'une liste dans le type, mais on peut utilisé un type Option pour faire la terminaison de récursion.
Pour info :
(item :: list) permet d'ajouter un item au début d'une list ou de décomposer une liste dans les matchs.
(foo plop) permet d'appliquer la fonction foo au paramètre plop
En conclusion, vive les types sommes et le "pattern matching" d'arbre.
"La première sécurité est la liberté"