我在F#interactive中尝试以下代码并获取'错误FS0001:类型'int - > int'与'int'类型不匹配。这是我正在尝试的代码
> let rec factorial n = function
| 0 -> 1
| n -> n * factorial (n - 1);;
这是'F3 for science'书中的例子。 谢谢,
答案 0 :(得分:4)
只是添加一些关于语法的细节 - 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#代码 - 第二个选项稍微复杂一点(没有任何理由),所以我更喜欢前两个中的一个。
答案 1 :(得分:3)
正如您所定义的那样,factorial
有两个参数,但您只传递一个参数。因此,函数的第二个分支试图将int
乘以int -> int
类型的部分应用函数。
第一行应为
let rec factorial = function
(没有n
)。