Я всегда считал, что в F # нам нужно использовать ключевое слово rec
для каждой рекурсивной функции, например:
let rec factorial = function
| 0 -> 1
| k when k > 0 -> k * (factorial (k - 1))
| failwith "oops!"
Сегодня я играл с F #, и я придумал код, похожий на следующий:
let MyRecordType =
{ Something : float;
SomethingElse : int }
with
static member factorial = function
| 0 -> 1
| k when k > 0 -> k * (MyRecordType.factorial (k - 1))
| failwith "oops!"
Как вы видите, я только что определил рекурсивную функцию, но я сделал то, что сначала казалось ошибкой: я забыл объявить функцию как рекурсивную с помощью ключевого слова rec
.
Но, к моему удивлению, компилирует! И еще к этому: если вы добавите ключевое слово rec
, то это синтаксическая ошибка!
type MyRecordType =
{ (* ... *) }
with
// syntax error:
static member rec factorial = function
(* ... *)
Я искал объяснения, но ничего не получил. В документации MSDN я не мог найти никакого упоминания ключевому слову rec
вне страницы о рекурсивных функциях и по состоянию на 2010-01 -03 он не упоминает случай, о котором я прошу.
То же самое происходит с нестационарными членами.
Итак, почему это синтаксическая ошибка для использования ключевого слова rec
для функций-членов типа записи?