There are many different schools of thought on how to program in “higher-order imperative languages” like OCaml. One school of thought is to eschew all imperative features, and use monads, which are a recoding of those imperative features using a particular coding style. The most common such imperative features which some people eschew are I/O (and concurrency), exceptions, and state (imperative update). All of these features have implementations in OCaml directly, but … well, there are reasons one might have for choosing to eschew those implementations.
There are vehement differences of opinion as to whether one should or should not use monads instead of (for instance) native threads. I would suggest two things:
- the biggest reason to use monads, is if some library you want to use, is coded using monads.
- if you plan to use monads, it is very, very, very much worth learning them carefully and thoroughly; it is very easy to make mistakes with them, and understanding how to program in proper monadic style is worth spending time on.