There is a kind of "do notation" in OCaml with binding operators [1] (let*) for monads and (let+) for applicatives that is actually quite pleasant in practice.
[1] https://ocaml.org/manual/5.2/bindingops.html