为什么函数调用返回错误?

时间:2011-10-27 16:25:50

标签: f#

我在F#interactive中尝试以下代码并获取'错误FS0001:类型'int - > int'与'int'类型不匹配。这是我正在尝试的代码

> let rec factorial n = function
    | 0 -> 1
    | n -> n * factorial (n - 1);;

这是'F3 for science'书中的例子。 谢谢,

2 个答案:

答案 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)。