caml << let is_man a = (List.assoc "gender" a = "M") >> sons(man[@a x] y,q) -> man[@a x] sons(y,q) sons(_[_] y,q) | sons(_ y,q) -> sons(y,q) sons((),q) -> q daughters(woman[@a x] y,q) -> woman[@a x] daughters(y,q) daughters(_[_] y,q) | daughters(_ y,q) -> daughters(y,q) daughters((),q) -> q split(_[@a _[%n _] _[c] _] y,q) -> let tag : string = << if is_man a then "man" else "woman" >> in let c = split(c,()) in let c = sons[sons(c,())] daughters[daughters(c,())] in let a' = << ["name",n] >> in %tag[ @a' c ] split(y,q) split(_ y,q) -> split(y,q) split((),q) -> q main(_[x] _) -> split(x,())