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