如何在Ocaml中打印递归函数的整数类型返回值。我想找到一个数字的阶乘。我使用下面的代码。但它显示错误
let rec factorial x =
if (0 > x) then (raise Exit) else
match x with
0 -> 1
| n -> (n * (factorial (n - 1)))
print_int(n *(factorial(n - 1)));;
尝试运行时会显示以下错误:
This expression is not a function; it cannot be applied
答案 0 :(得分:2)
我不确定我是否理解这个问题,也不确定zurgl的答案,所以这是在黑暗中拍摄的。你忘记了“;;”你的函数定义和“print_int”行之间?你的帖子不清楚,但如果你写了:
let rec factorial x =
if (0 > x) then (raise Exit) else
match x with
0 -> 1
| n -> (n * (factorial (n - 1)))
print_int (n * (factorial (n - 1)));;
然后它与:
相同let rec factorial x =
if (0 > x) then (raise Exit) else
match x with
0 -> 1
| n -> (n * (factorial (n - 1))) print_int (n * (factorial (n - 1)));;
所以你想要的是:
let rec factorial x =
if (0 > x) then (raise Exit) else
match x with
0 -> 1
| n -> (n * (factorial (n - 1)));;
print_int (n * (factorial (n - 1)));;
或者,没有“;;” (这有点过时了):
let rec factorial x =
if (0 > x) then (raise Exit) else
match x with
0 -> 1
| n -> (n * (factorial (n - 1)))
let () = print_int (n * (factorial (n - 1)))
当然这有另一个问题,那就是当你调用print_int时n是未绑定的,这就是为什么我不确定我理解你的问题。但是下面的代码工作正常:
let rec factorial x =
if (0 > x) then (raise Exit) else
match x with
0 -> 1
| n -> (n * (factorial (n - 1)))
let () = print_int (factorial 10)
答案 1 :(得分:1)
错误的原因是由于推断了分支的代码类型。
关于第一个分支,类型检查器推断一个int将由你的函数产生,但在你的函数体的末尾,你正在调用一个表达式,它将产生一个单元类型()
,因此类型无法正确推断您的函数,然后以这种错误消息结束。
为避免这种情况,您需要通知您的编译器,而不应考虑此表达式,为此,您可以使用函数ignore
作为类型注释'a -> unit = <fun>
。
我稍微修改了代码的含义,为您提供了说明。
let rec factorial = function
| n when n<0 -> raise (Failure "undefined: positive integer is required.")
| 0 -> 0
| 1 -> ignore (Printf.printf "1\n"); 1
| n -> ignore (Printf.printf "%d*" n); n * factorial (n-1)
;;
val factorial : int -> int = <fun>
执行结束时,你将结束。
factorial 10;;
10*9*8*7*6*5*4*3*2*1
- : int = 3628800 - :