Because OCaml is a functional language, variables are immutable
You can't change the value of a function parameter: there's no assignment statement for function parameters!
Invalid!
let f x = x := x + 1
Function parameters are initialized at the call, but can't be changed thereafter (i.e. within the body of the function).
Same for let-bindings! (Because let-bindings and function parameter bindings are, in fact, identical.)
You might think you can change the binding with an inner let:
One x, another x...
let f x = let x = x + 1 in x
This is valid, useful, and idiomatic, but the inner x is a completely different binding, due to the nesting: you haven't changed f's x.
But how do we write a while loop?
let running = true in while running do ??? done
The following loop will never terminate, because the inner variable running is not the same as the loop-control variable!
let running = true in while running do let running = false in (* anything *) done
A purely functional programming language only has immutable variables. This is (proved) sufficient to write any possible program.
But OCaml is not a purely functional language. It has immutable variable bindings but has mutable values.