Yes, that's true that there are lots comparing operations that are not needed here.

After reconsidering the `take` and `drop`, I guess they can be abstracted as an operation that "fold"s the first n elements as a list and produces a record of the accumulator and the remaining tail of the original list. I implemented on at https://github.com/ocaml/ocaml.org/pull/380#issuecomment-31457782 .