type Person = FPerson | MPerson;; type FPerson = [ Name Children ];; type MPerson = [ Name Children];; type Children = [Person*];; type Name = [ PCDATA ];; type Man = [ Sons Daughters ];; type Woman = [ Sons Daughters ];; type Sons = [ Man* ];; type Daughters = [ Woman* ];; let fun sort (MPerson -> Man ; FPerson -> Woman) [ n [(mc::MPerson | fc::FPerson)*] ] -> let tag = match g with "F" -> `woman | "M" -> `man in let s = map mc with x -> sort x in let d = map fc with x -> sort x in <(tag) name=n>[ s d ] ;; let base : Person = [ "Veronique" [ [ "Ilaria" [] ] ] ] ;; sort base;; (* compilation efficace avec _ a la place de person *) let fun name (Person | Man | Woman -> String) [ n ; _ ] | <_ name=n>_ -> n;; name base;; name (sort base);;