2

我正在尝试为 O'Railey,Chris Smith 第 53 页的 Programming F# 做一个示例。

它正在使用返回函数的函数。

VS2013 IDE Editor、FSI 和 LinqPad4 中的这本书直接给出了错误:

代码:

let generatePowerOfFunc base = (fun exponent -> base ** exponent)

错误:

error FS0010: Unexpected keyword 'base' in pattern

我遗漏了什么,或者作者没有包含哪些内容需要包含在内。

4

2 回答 2

6

我强烈怀疑这只是base在写这本书时不是关键字的问题。

尝试不同的标识符:

let generatePowerOfFunc b = (fun exponent -> b ** exponent)

假设您有 2009 年版的 Programming F#,那将是在 F# 2.0 发布之前(尽管在 1.0 之后)。我试图找出它是什么时候作为关键字引入的......

编辑:实际上,查看2009 年编写的这个版本的规范,看起来base那时已经是一个关键字。我想知道原始代码是否在本书出版之前就已经写好了。

无论哪种方式,我认为基本上将其视为错误是合理的,而使用有效的标识符应该没问题。

编辑:它实际上列在本书的勘误表中:

示例 3-3 在 VS 2010 中不能按原样工作。“base”显然是一个关键字,所以它应该被转义,或者有一些巫术使它不是我在书中遗漏的关键字。示例的第 2 行应如下所示:

   let generatePowerOfFunc ``base`` = (fun exponent -> ``base`` ** exponent);;

或者,应选择不同的变量名称。

作者或编辑的注释:
感谢您的反馈,我一定错过了在产品周期后期标记为保留的关键字。

在本书的未来版本中,我将阅读:

 let generatePowerOfFunc baseValue = (fun exponent -> baseValue ** exponent);;
于 2013-08-09T23:06:52.637 回答
3

base在 F# 中是一个关键字,它指的是父类。

您可以使用双反引号,如下所示

let generatePowerOfFunc ``base`` = (fun exponent -> ``base`` ** exponent);;

或者只是将参数的名称更改为其他名称。

于 2013-08-09T23:07:01.613 回答