【发布时间】:2011-10-28 04:59:20
【问题描述】:
我在 F# 交互中尝试以下代码并得到“错误 FS0001:类型“int -> int”与类型“int”不匹配。这是我正在尝试的代码
> let rec factorial n = function
| 0 -> 1
| n -> n * factorial (n - 1);;
这是“科学家的 F3”书籍示例的关闭。 谢谢,
【问题讨论】:
标签: f#
我在 F# 交互中尝试以下代码并得到“错误 FS0001:类型“int -> int”与类型“int”不匹配。这是我正在尝试的代码
> let rec factorial n = function
| 0 -> 1
| n -> n * factorial (n - 1);;
这是“科学家的 F3”书籍示例的关闭。 谢谢,
【问题讨论】:
标签: f#
只是添加一些有关语法的细节 - function 关键字创建一个函数,该函数接受一个参数(隐含地,没有命名它),然后允许您对该值进行模式匹配。
有很多等效的方法可以做到这一点 - 使用 function 就像 ildjarn 描述的那样:
let rec factorial = function
| 0 -> 1
| n -> n * factorial (n - 1)
您也可以将factorial 声明为采用n 的函数,然后使用match:
let rec factorial n =
match n with
| 0 -> 1
| n -> n * factorial (n - 1)
为了完整起见,您还可以使用fun 创建一个函数(这是function 的一个更简单的版本,它不允许您编写多个模式匹配案例):
let rec factorial = fun n ->
match n with
| 0 -> 1
| n -> n * factorial (n - 1)
前两个选项都是惯用的 F# 代码 - 第二个稍微复杂一些(没有任何充分理由),所以我更喜欢前两个中的一个。
【讨论】:
正如您定义的那样,factorial 接受两个参数,但您只传递一个参数。因此,函数的第二个分支试图将 int 与 int -> int 类型的部分应用函数相乘。
第一行应该是
let rec factorial = function
(没有n)。
【讨论】: