如何在Ocaml中打印函数返回值

时间:2014-01-12 07:54:12

标签: function ocaml

如何在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

2 个答案:

答案 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                                                                       - :