Возможный дубликат:
Почему функции в 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
? Это проблема производительности или что-то более тонкое?