Возможный дубликат:
Почему функции в Ocaml/F # не рекурсивные по умолчанию?
OCaml использует let для определения новой функции или let rec для определения рекурсивной функции. Зачем это нужно обоим? Не могли бы мы просто использовать let для всего?
Например, чтобы определить нерекурсивную функцию-преемник и рекурсивный факториал в OCaml (фактически, в интерпретаторе OCaml), я мог бы написать
let succ n = n + 1;;
let rec fact n =
if n = 0 then 1 else n * fact (n-1);;
В то время как в Haskell (GHCI) я могу написать
let succ n = n + 1
let fact n =
if n == 0 then 1 else n * fact (n-1)
Почему OCaml различает let и let rec? Это проблема производительности или что-то более тонкое?