Mapping GADT AST node to list of it's children not allowed by compiler?

Have you tried adding a locally abstract type annotation to your function?

let take_next (type a) (x : a t) = ...

See https://discuss.ocaml.org/t/locally-abstract-type-polymorphism-and-function-signature for a longer discussion of this.

Cheers,
Nicolas