Bru*_*eis 25 recursion f# record
我一直认为在F#中我们需要rec为每个递归函数使用关键字,例如:
let rec factorial = function
| 0 -> 1
| k when k > 0 -> k * (factorial (k - 1))
| failwith "oops!"
Run Code Online (Sandbox Code Playgroud)
今天我正在玩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!"
Run Code Online (Sandbox Code Playgroud)
如你所见,我刚刚定义了一个递归函数,但我最初看起来像是一个错误:我忘了通过关键字将函数声明为递归函数rec.
但令我惊讶的是它汇编了!还有更多:如果你添加rec关键字,那么这是一个语法错误!
type MyRecordType =
{ (* ... *) }
with
// syntax error:
static member rec factorial = function
(* ... *)
Run Code Online (Sandbox Code Playgroud)
我已经用Google搜索了解释但没有得到任何结果.在MSDN文档中,我找不到页面rec外关于递归函数的关键字,并且截至2010-01-03它没有提到我要问的情况.
非静态成员完全相同.
那么,为什么rec在记录类型的成员函数上使用关键字会出现语法错误?
Sam*_*ami 17
'let rec'不是定义递归函数,而是定义环境中的绑定,包括绑定当前变量的绑定.您也可以使用'let rec'来定义例如无限列表.通常,您不希望绑定包含在环境中,因为您可能希望使用相同的名称访问早期变量.
当您定义静态成员函数factorial时,您不是在寻找变量'factorial'的绑定,而是寻找类型'MyRecordType'(在环境中作为类型定义),如果它恰好发生在它有一个名为'factorial'的静态成员函数.