I ve always believed that in F# we needed to use the rec
keyword for every recursive function, for example:
let rec factorial = function
| 0 -> 1
| k when k > 0 -> k * (factorial (k - 1))
| failwith "oops!"
Today I was playing around with F# and I came up with a code similar to the following:
let MyRecordType =
{ Something : float;
SomethingElse : int }
with
static member factorial = function
| 0 -> 1
| k when k > 0 -> k * (MyRecordType.factorial (k - 1))
| failwith "oops!"
As you see, I ve just defined a recursive function, but I made what at first seemed like a mistake: I forgot to declare the function as recursive by means of the rec
keyword.
But to my surprise it compiles! And there s more to it: if you add the rec
keyword, then it is a syntax error!
type MyRecordType =
{ (* ... *) }
with
// syntax error:
static member rec factorial = function
(* ... *)
I ve googled around for an explanation but got nothing. In the MSDN documentation, I couldn t find any mention to the rec
keyword outside the page about recursive functions, and as of 2010-01-03 it does not mention the case I m asking about.
Exactly the same thing happens with non-static members.
So, why is it a syntax error to use the rec
keyword on member functions of a record-type?