From Real World OCaml (beta):
OCaml distinguishes between non-recursive definitions (using
let) and recursive definitions (using
let rec) largely for technical reasons: the type-inference algorithm needs to know when a set of function definitions are mutually recursive, and for reasons that don't apply to a pure language like Haskell, these have to be marked explicitly by the programmer.
Why is this the case (what is the technical reason, exactly), and why does a pure language like Haskell “get away” with not having to tag functions as recursive?