2014-01-12 4 views
0

Как напечатать возвращаемое значение целого типа рекурсивной функции в Ocaml.I хочет найти Факториал number.I использовать следующие code.But он показывает ошибкуКак напечатать функцию возвращаемого значения в 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

Можете ли вы опубликовать сообщение об ошибке? – Durandal

+0

Ошибка: «Это выражение не является функцией, оно не может быть применено» –

+3

Этот код работает для меня. –

ответ

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                  - : 
1

Я не уверен, что я понимаю вопрос или ответ 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, поэтому я не уверен, что понял ваш вопрос. Но следующий код работает нормально:

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) 
Смежные вопросы